﻿function InitDatePickerStd(id, setting, autoPostBack, idWrap)
{

	var x = $j('#' + id);
	if (x.length == 0) return;

	var i, c, t, cal;

	t = $j(".Toggle", x);
	c = $j("#" + idWrap);

	$j("form:first").append(c);

	/* IE 6 Hack. Selects html elements are 'windowed' on IE 6, that means a div can't be basicaly be displayed over them.
	An empty iframe appended to a div with a css hack will hide 'windowed' elements. (See datepicer css to find css hack) */
	if (jQuery.browser.msie && parseInt(jQuery.browser.version) <= 6) c.append('<iframe></iframe>');


	cal = $j("div:first", c);
	var iCal = cal.CukeCalendar();

	c.css("top", t.offset().top + t.outerHeight() + 1);
	c.css("left", t.offset().left);

	// Handle calendar slide down.
	t.click(function()
	{
		var scroll = (typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.body.offsetHeight);
		var ch = (typeof window.innerHeight != 'undefined' ? window.innerHeight : document.body.offsetHeight);

		var t = $j(this).offset().top;
		var displayTop = t + $j(this).outerHeight() + 1;
		var h = c.outerHeight();

		if (t + h - scroll > ch) displayTop = $j(this).offset().top - h;
		c.css("top", displayTop);
		c.css("left", $j(this).offset().left + 1);
		c.show();
	});

	function dayInMonth(d)
	{
		var d = new Date( Date.UTC( d.getUTCFullYear(), d.getUTCMonth() + 1, 0 ) );
		return d.getUTCDate();
	}

	// Handle calendar slide up
	$j(document).click(function(e)
	{
		if ((e.pageX < c.offset().left || e.pageX > c.offset().left + c.outerWidth() || e.pageY < c.offset().top || e.pageY > c.offset().top + c.outerHeight()))
			if ((e.pageX < t.offset().left || e.pageX > t.offset().left + t.outerWidth() || e.pageY < t.offset().top || e.pageY > t.offset().top + t.outerHeight()))
			c.hide();
	});

	var onSelect;

	var eventCalendarSelected = "(" + id + ")DatePickerByCalendarDateChanged";
	var eventDaySelected = "(" + id + ")DatePickerByDayDateChanged";
	var eventMonthSelected = "(" + id + ")DatePickerByMonthDateChanged";
	var eventMonthYearSelected = "(" + id + ")DatePickerByMonthYearDateChanged";
	var eventYearSelected = "(" + id + ")DatePickerByYearDateChanged";


	// Configuration Case > "TextBox"
	if (setting == 'TextBox')
	{
		i = $j("input.InputText", x);
		cal.CukeCalendar().ensureFirstSelectedVisible();
		onSelect = function(date)
		{
			var ci = Cuke.Localization.CultureInfo;
			var day = ci.DayNames[date.getUTCDay()];
			var month = ci.MonthNames[date.getUTCMonth()];
			i.val(Cuke.Localization.FormatDate(ci.LongDatePattern, date));
			c.slideUp("100", function() { if (autoPostBack) __doPostBack(id, ''); });
			Cuke.SyncDic.dispatch(eventCalendarSelected, cal.CukeCalendar());
		}

	}
	// Configuration Case > "Select"
	else if (setting == 'Select')
	{
		var sDay, sMonth, sYear;
		sDay = $j(".Day", x);
		sMonth = $j(".Month", x);
		sYear = $j(".Year", x);


		var getDisplayDate = function()
		{
			var y = $j("option:selected", sYear).attr('value');
			var m = $j("option:selected", sMonth).attr('value');
			var d = $j("option:selected", sDay).attr('value');

			if (y != '-' && m != '-' && d != '-') return new Date(Date.UTC(y, m, d));
			else return null;
		}

		var setDisplayDate = function(date)
		{
			var mustUpdateDayList = false;
			var y = $j("option:selected", sYear).attr('value');
			var m = $j("option:selected", sMonth).attr('value');
			var d = $j("option:selected", sDay).attr('value');

			if (y != date.getUTCFullYear())
			{
				$j("option:selected", sYear).removeAttr("selected");
				$j("option[value=" + date.getUTCFullYear() + "]", sYear).attr("selected", "selected");
				mustUpdateDayList = true;
			}

			if (m != date.getUTCMonth())
			{
				$j("option:selected", sMonth).removeAttr("selected");
				$j("option[value=" + date.getUTCMonth() + "]", sMonth).attr("selected", "selected");
				mustUpdateDayList = true;
			}

			if (d != date.getUTCDate())
			{
				$j("option:selected", sDay).removeAttr("selected");
				$j("option[value=" + date.getUTCDate() + "]", sDay).attr("selected", "selected");
			}

			if (mustUpdateDayList)
			{
				dayMonth = dayInMonth(date);

				$j("option[value!=-]", sDay).each(function(x)
				{
					if (parseInt($j(this).attr("value")) > dayMonth) $j(this).attr("style", "display:none;");
					else $j(this).attr("style", "display:block;");
				});
			}
		}

		// Calendar update handler
		onSelect = function(date)
		{
			setDisplayDate(date);
			c.slideUp("100", function() { if (autoPostBack) __doPostBack(id, ''); });
			Cuke.SyncDic.dispatch(eventCalendarSelected, cal.CukeCalendar());
		}

		var updateFunc = function()
		{

			var d = getDisplayDate();

			if (d != null)
			{
				if (!cal.CukeCalendar().selectDate(d)) onSelect(cal.CukeCalendar().selected[0]);
				cal.CukeCalendar().ensureVisible(d);
			}
			else
			{
				cal.CukeCalendar().clearSelectedDate();
			}
		}

		sDay.change(function()
		{
			var d = getDisplayDate();
			if (d != null)
			{
				if (d < iCal.settings.MinDate)
				{
					var next = new Date(d.getTime());
					next.setUTCMonth(d.getUTCMonth() + 1);

					if (next <= iCal.settings.MaxDate)
					{
						iCal.selectDate(next);
						return;
					}
				}
				else if (d > iCal.settings.MaxDate)
				{
					var prev = new Date(d.getTime());
					prev.setUTCMonth(d.getUTCMonth() - 1);

					if (prev >= iCal.settings.MinDate)
					{
						iCal.selectDate(prev);
						return;
					}
				}
			}
			else
			{
				$j("option[value!=-]", sDay).attr('style', 'display:block;');
			}

			updateFunc();
			Cuke.SyncDic.dispatch(eventDaySelected, sDay);

		}).change();

		sMonth.change(function()
		{
			var d = getDisplayDate();
			if (d != null)
			{
				if (d < iCal.settings.MinDate)
				{
					var next = new Date(d.getTime());
					next.setUTCFullYear(d.getUTCFullYear() + 1);

					if (next <= iCal.settings.MaxDate)
					{
						iCal.selectDate(next);
						return;
					}
				}
				else if(d > iCal.settings.MaxDate)
				{
					var prev = new Date(d.getTime());
					prev.setUTCFullYear(d.getUTCFullYear() - 1);

					if (prev >= iCal.settings.MinDate)
					{
						iCal.selectDate(prev);
						return;
					}
				}
			}
			else
			{
				$j("option[value!=-]", sDay).attr('style', 'display:block;');
			}

			updateFunc();
			Cuke.SyncDic.dispatch(eventMonthSelected, sMonth);
			
		}).change();

		sYear.change(function()
		{
			var d = getDisplayDate();

			if (d == null)
			{
				$j("option[value!=-]", sDay).attr('style', 'display:block;');
			}

			updateFunc();
			Cuke.SyncDic.dispatch(eventYearSelected, sYear);

		}).change();

	}
	// Configuration Case > "SelectMonthYear"
	else if (setting == 'SelectMonthYear')
	{
		var sDay, sMonth;
		sDay = $j(".Day", x);
		sMonth = $j(".MonthYear", x);

		var getDisplayDate = function()
		{
			var m = $j("option:selected", sMonth).attr('value');
			var d = $j("option:selected", sDay).attr('value');

			if (m != '-' && d != '-')
			{
				var s = m.split('/');
				return new Date(Date.UTC(s[1], s[0], d));
			}
			else
			{
				return null;
			}
		}

		var setDisplayDate = function(date)
		{
			var m = $j("option:selected", sMonth).attr('value');
			var d = $j("option:selected", sDay).attr('value');

			if(d != date.getUTCDate())
			{
				$j("option:selected", sDay).removeAttr("selected");
				$j("option[value=" + date.getUTCDate() + "]", sDay).attr("selected", "selected");
			}

			if (m != (date.getUTCMonth() + "/" + date.getUTCFullYear()))
			{
				$j("option:selected", sMonth).removeAttr("selected");
				$j("option[value=" + date.getUTCMonth() + "/" + date.getUTCFullYear() + "]", sMonth).attr("selected", "selected");

				dayMonth = dayInMonth(date);

				$j("option[value!=-]", sDay).each(function(x)
				{
					if (parseInt($j(this).attr("value")) > dayMonth) $j(this).attr("style", "display:none;");
					else $j(this).attr("style", "display:block;");
				});
			}
			
		}

		onSelect = function(date)
		{
			setDisplayDate(date);
			c.slideUp("100", function() { if (autoPostBack) __doPostBack(id, ''); });
			Cuke.SyncDic.dispatch(eventCalendarSelected, cal.CukeCalendar());
		}

		var updateFunc = function()
		{
			var d = getDisplayDate();

			if (d != null)
			{
				if (!cal.CukeCalendar().selectDate(d)) onSelect(cal.CukeCalendar().selected[0]);
				cal.CukeCalendar().ensureVisible(d);
			}
			else cal.CukeCalendar().clearSelectedDate();
		}

		sDay.change(function()
		{

			var d = getDisplayDate();
			if (d != null)
			{
				if (d < iCal.settings.MinDate)
				{
					var next = new Date(d.getTime());
					next.setUTCMonth(d.getUTCMonth() + 1);

					if (next <= iCal.settings.MaxDate)
					{
						iCal.selectDate(next);
						return;
					}
				}
				else if (d > iCal.settings.MaxDate)
				{
					var prev = new Date(d.getTime());
					prev.setUTCMonth(d.getUTCMonth() - 1);

					if (prev >= iCal.settings.MinDate)
					{
						iCal.selectDate(prev);
						return;
					}
				}
			}

			updateFunc();
			Cuke.SyncDic.dispatch(eventDaySelected, sDay);

		}).change();

		// TODO Update sDay if the day doesn't exists in the current month.
		sMonth.change(function()
		{

			updateFunc();
			Cuke.SyncDic.dispatch(eventMonthYearSelected, sMonth);

		}).change();

	}

	var func = function() { cal.CukeCalendar().select(onSelect); }
	// Loads Culture Infos
	Cuke.Localization.LoadCultureInfo(func);

};
