Current File : /home/inlingua/public_html/icentex/jquery/development-bundle/ui/jquery.datePickerMultiMonth.js
/**
 * Copyright (c) 2008 Kelvin Luck (http://www.kelvinluck.com/)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 **/

(function($){
    
	$.fn.extend({
		datePickerMultiMonth : function(s)
		{
			s.numMonths = s.numMonths || 2;

			$(this).each(
				function()
				{

					var dps = $.extend({}, $.fn.datePicker.defaults, s);

					var $dpmm = $(this);
					var pickers = [];
					var basePicker;

					var m;
					
					if (s.inline) {

						$dpmm.html('');

						for (var i=0; i<s.numMonths; i++)
						{
							(function(i) {
								var first = i == 0;
								var last = i == s.numMonths - 1;
								var $date =  $('<div></div>')
												.datePicker(dps)
												.bind('dpMonthChanged',
													function(event, displayedMonth, displayedYear)
													{
														if (first) {
															$dpmm.trigger('dpMonthChanged', [displayedMonth, displayedYear]);
														} else {
															pickers[i-1].dpSetDisplayedMonth(displayedMonth-1, displayedYear);
														}
														if (!last)	{
															pickers[i+1].dpSetDisplayedMonth(displayedMonth+1, displayedYear);
														}
														return false;
													}
												)
												.bind(
													'dateSelected',
													function(event, date, $td, status)
													{
														if (!first)	{
															pickers[i-1].dpSetSelected(date.asString(), status, false);
														}
														if (!last)	{
															pickers[i+1].dpSetSelected(date.asString(), status, false);
														}
														if (first) {
															$dpmm.trigger('dateSelected', [date, $td, status]);
														}
														return false;
													}
												);
								$date.find('.dp-nav-prev').css('display', first ? 'block' : 'none');
								$date.find('.dp-nav-next').css('display', last ? 'block' : 'none');
								pickers.push($date);
								$dpmm.append($date);
							})(i);
						}
						basePicker = pickers[0];
						
					} else {
						
						var displayedMonth;
						var displayedYear;
						var selectedDate;

						if (dps.closeOnSelect == false) throw new Error("Popup multi month date pickers must close on select");
						if (dps.selectMultiple == true) throw new Error("Popup multi month date pickers aren't compatible with selectMultiple");

						$dpmm.datePicker(dps).bind(
							'dateSelected',
							function(event, date, $td, status)
							{
								selectedDate = date.asString();
							}
						).bind(
							'dpDisplayed',
							function(event, datePickerDiv)
							{
								var $popup = $(datePickerDiv).empty().css({width: 'auto'});

								var d = $dpmm.dpGetSelected();
								if (d.length) {
									selectedDate = new Date(d[0]).asString();
								}
								

								for (var i=0; i<s.numMonths; i++) {
									(function(i) {
										var s = $.extend({}, dps);
										s.inline = true;
										s.month = displayedMonth + i;
										s.year = displayedYear;
										
										var last = i == s.numMonths-1;
										var first = i == 0;

										var $dp = $('<div></div>');
										$popup.append($dp);


										$dp.datePicker(s).bind(
												'dpMonthChanged',
												function(event, newMonth, newYear)
												{
													if (i == 0)	{
														displayedMonth = newMonth;
														displayedYear = newYear;
													}
													if (!first) {
														pickers[i-1].dpSetDisplayedMonth(newMonth-1, newYear);
													}
													if (!last)	{
														pickers[i+1].dpSetDisplayedMonth(newMonth+1, newYear);
													}
													return false;
												}
											).bind(
												'dateSelected',
												function(event, date, $td, status)
												{
													var d = date.asString();
													if (d != selectedDate) {
														basePicker.dpSetSelected(date.asString());
														basePicker.dpClose();
													}
												}
											).find('.dp-nav-next').css('display', last ? 'block' : 'none').end()
											 .find('.dp-nav-prev').css('display', first ? 'block' : 'none').end();

										if (selectedDate) {
											$dp.dpSetSelected(selectedDate, true, false);
										}
										pickers.push($dp);
									})(i);
								}
							}
						).bind(
							'dpMonthChanged',
							function(event, newMonth, newYear)
							{
								if (newMonth == displayedMonth && newYear == displayedYear) {
									return;
								}
								displayedMonth = newMonth;
								displayedYear = newYear;
								$dpmm.trigger('dpMonthChanged', [newMonth, newYear])
							}
						).bind(
							'dpClosed',
							function(event, selected)
							{
								pickers = [];
							}
						);
						basePicker = $dpmm;
					}

					$dpmm.data('dpBasePicker', basePicker);
					$dpmm.data('dpPickers', pickers);

					// dodgy hack so that I can set the month to the correct value and trigger a redraw of the other elements... 
					basePicker.dpSetDisplayedMonth(1, 3000);
					// set the month to the correct value so the other date pickers get set to the correct months...
					basePicker.dpSetDisplayedMonth(Number(s.month), Number(s.year));
				}
			);
			return this;
		},
		dpmmGetSelected : function()
		{
			var basePicker = $(this).data('dpBasePicker');
			return basePicker.dpGetSelected();
		},
		dpmmSetSelected : function(d, v, m, e)
		{
			var pickers = $(this).data('dpPickers');
			var r = pickers[0].dpSetSelected(d, v, m, e);
			for (var i=1; i<pickers.length; i++) {
				pickers[i].dpSetSelected(d, v, m, false);
			}
			return r;
		},
		dpmmRerenderCalendar : function()
		{
			var pickers = $(this).data('dpPickers');
			for (var i=0; i<pickers.length; i++) {
				pickers[i].dpRerenderCalendar();
			}
		}
	});
	
})(jQuery);