
// implement our own, accessible version of datepicker
jQuery.fn._datepicker = jQuery.fn.datepicker;
jQuery.fn.datepicker = function(options) {

	var field = this;

	field.attr('autocomplete', 'off');

	var key_up = 38;
	var key_down = 40;
	var key_enter = 13;
	var key_left = 37;
	var key_right = 39;
	
	this._datepicker(options);
	
	this.keyup(function(event) {
		if (jQuery.inArray(event.keyCode, [key_up, key_down, key_left, key_right]) > -1) {
			var current = field._datepicker('getDate');
			if (current == null)
				current = new Date();
			if (event.keyCode == key_up)
				current.setDate(current.getDate()-7);
			else if (event.keyCode == key_down)
				current.setDate(current.getDate()+7);
			else if (event.keyCode == key_left)
				current.setDate(current.getDate()-1);
			else if (event.keyCode == key_right)
				current.setDate(current.getDate()+1);
				
			field._datepicker('setDate', current);
			var y = current.getYear();
			if (y < 1900) y+= 1900;
			var m = current.getMonth()+1;
			if (m < 10) m = '0'+m;
			var d = current.getDate();
			if (d < 10) d = '0'+d;
			
			field.val(m+'/'+d+'/'+y);
			
			event.cancelBubble = true;
			if (event.stopPropagation) event.stopPropagation();
			return false;
		}
	});
	
	this.keypress(function(event) {
		if (jQuery.inArray(event.keyCode, [key_up, key_down, key_left, key_right]) > -1) {
 			event.stopPropagation();
 			return false;
 		}
	});
};
	
jQuery.fn.timepicker = function() {
	
	var field = this;
	
	field.attr('autocomplete', 'off');
	
	var hide_timeout = null;
	var key_up = 38;
	var key_down = 40;
	var key_enter = 13;
	
	$('body').append('<select size="10" id="'+field.attr('id')+'_options"></select>');
	var time_options = $('#'+field.attr('id')+'_options');
	var select = time_options[0];
	
	time_options
		.css('position', 'absolute')
		.hide();
	
	time_options.focus(function() {
		clearTimeout(hide_timeout);
	});
	
	time_options.click(function() {
		var selected = select.options[select.selectedIndex];
		field.val(selected.text);
		hide_timeout = setTimeout(function() {
			time_options.hide();
		}, 100);
	});
	
	time_options.blur(function() {
		hide_timeout = setTimeout(function() {
			time_options.hide();
		}, 150);
	});
	
	var morning = new Date("1/1/2008 0:00");
	var i = 0;
	do {
		var hour = morning.getHours();
		var h = hour;
		var min = morning.getMinutes();
		var m = min;
		var tt = (hour >= 12) ? 'pm' : 'am';
		
		if (m < 10) m = '0' + m;
		if (h == 0) 
			h = '12';
		else if (h >= 13) 
			h -= 12;
			
		if (hour < 10)
			hour = '0' + hour;
		if (min < 10)
			min = '0' + min;
			
		select.options[select.options.length] = new Option(h+':'+m+tt, hour+':'+min+':00'); 
		
		morning.setTime(morning.getTime() + (1000*60*30));
		i++;
	} while (i < 48);
	
	this.focus(function() {
		clearTimeout(hide_timeout);
		field[0].ignore_next_click = true;
		
		// grab the coordinate location of the text input
		var offset = field.offset();
		// grab the padding of the text input
		var padding = field.css("padding");
		if (!padding) padding = 0;
		
		// special, additional offset for ie
		var ie_offset = 0; //(jQuery.browser.msie) ? 7 : 0;
		
		time_options
			.css("left", offset.left)
			.css("top", offset.top + 11 + field.height() + parseInt(padding) + ie_offset)
			.show();
			
		var option_found = false;
		var typed = field.val();
		if (!typed)
			typed = '8:00am';
			
		for (i=0; i<select.options.length; i++) {
			if (select.options[i].text == typed) {
				option_found = true;
				select.selectedIndex = i;
				break;
			}
		}
		
		if (!option_found)
			field.val('');
	});
	
	this.blur(function() {
		hide_timeout = setTimeout(function() {
			time_options.hide();
		}, 100);
	});
	
	this.click(function() {
		if (!field[0].ignore_next_click) {
			time_options.hide();
		}
		field[0].ignore_next_click = false;
	});
	
	this.keyup(function(event) {
		if (jQuery.inArray(event.keyCode, [key_up, key_down]) > -1) {
			select.selectedIndex += (event.keyCode == key_up) ? -1 : 1; // reverse logic
			
			if (select.selectedIndex < 0)
				select.selectedIndex = 0;
			else if (select.selectedIndex > select.options.length-1)
				select.selectedIndex = (select.options.length-1);
				
			time_options.click();
			clearTimeout(hide_timeout);
				
			event.stopPropagation();
			return false;
		}
		else if (event.keyCode == key_enter) {
			time_options.click();
			event.stopPropagation();
			return false;
		}
	});
	
	this.keypress(function(event) {
 		if (jQuery.inArray(event.keyCode, [key_up, key_down, key_enter]) > -1) {
 			event.stopPropagation();
 			return false;
 		} 
	});
	

};

jQuery.datepicker.weekOfMonth = function(date) {
	var offset = new Date();
	offset.setTime(date.getTime());
	offset.setDate(1);
	var today = date.getDate() + offset.getDay();
	return Math.ceil(today/7) + (date.getDay() < offset.getDay() ? -1 : 0);
}

jQuery(document).ready(function() {
	jQuery('input.time').each(function() {
		jQuery(this).timepicker();
	});
	
	jQuery('input.calendar').each(function() {
		jQuery(this).datepicker({
			rangeSelect: false,
			closeAtTop: false,
			useShortYear: false,
			prevText: '&laquo; Earlier',
			nextText: 'Later &raquo;',
			numberOfMonths: [1, 2],
			dayNamesMin: ['S','M','T','W','T','F','S'],
			changeFirstDay: false,
			speed: ''
		});
	});	
	
	jQuery('input.calendar-simple').each(function() {
		jQuery(this).datepicker({
			rangeSelect: false,
			closeAtTop: false,
			useShortYear: false,
			prevText: '&nbsp;&laquo;&nbsp;',
			nextText: '&nbsp;&raquo;&nbsp;',
			dayNamesMin: ['S','M','T','W','T','F','S'],
			changeFirstDay: false,
			speed: ''
		});
	});
	
	jQuery('input.calendar-monthyear').each(function() {
		jQuery(this).datepicker({
			rangeSelect: false,
			closeAtTop: false,
			useShortYear: false,
			prevText: '&nbsp;&laquo;&nbsp;',
			nextText: '&nbsp;&raquo;&nbsp;',
			dayNamesMin: ['S','M','T','W','T','F','S'],
			changeFirstDay: false,
			speed: '',
			dateFormat: 'MM yy'
		});
	});
});

