﻿DateTime.ShowPopupCalendar = function(e)
{
	if (!this.PopupCalendar)
	{
		var dateControl    = document.getElementById(this.id.replace(/_Select$/, ""));
		this.PopupCalendar = DateTime.LoadCalendar(this, dateControl);
	}
	this.PopupCalendar.Show();
}

DateTime.GetDateFromDateBox = function(control)
{
	var dateParsed = /^(?:(\d\d)(\d\d)(\d{4}|\d\d))$/.exec(control.value);
	if (!dateParsed)
	{
		dateParsed = /^(?:(\d\d?)[-\.\/](\d\d?)[-\.\/](\d{1,4}))$/.exec(control.value);
		if (!dateParsed)
		{
			return NaN;
		}
	}
	var day   = parseInt(dateParsed[1], 10);
	var month = parseInt(dateParsed[2], 10) - 1;
	var year  = parseInt(dateParsed[3], 10);
	if (year < 100)
	{
		year += (year < 50)? 2000: 1900;
	}
	var date = new Date(year, month, day);
	if ((date.getFullYear() != year) ||
		(date.getMonth()    != month)||
		(date.getDate()     != day))
	{
		return NaN;
	}
	return date;
};

DateTime.InitializeCalendar = function (dateControl)
{
	var button = document.getElementById(dateControl.id + "_Select");
	if (button)
	{
		document.AddEventListener(button, "onclick", new Delegate(DateTime.ShowPopupCalendar, button));
	}

	var validation = new Delegate(DateTime.ValidateDateBox, dateControl);
	document.AddEventListener(dateControl, "onblur",   validation);
	document.AddEventListener(dateControl, "onchange", validation);
}

DateTime.LoadCalendar = function(control, dateControl)
{
	var popup             = document.CreateElementExt("div", {"class": "PopupCalendar"}, {display:"none"});
	popup.Show            = DateTime.ShowCalendar;
	popup.Hide            = new Delegate(DateTime.HideCalendar, popup);
	popup.onclick         = document.CancelBubble;
	popup.DateControl     = dateControl;
	control.PopupCalendar = popup;
	document.body.appendChild(popup);
	
	document.DisableSelection(popup);	
	popup.IeFix = document.CreateElementExt("iframe", {src:control.src}, {width:"100%", height:"100%"});
	popup.appendChild(popup.IeFix);
	var table   = document.CreateElementExt("table");
	popup.appendChild(table);

	var theader = document.CreateElementExt("thead");
	table.appendChild(theader);
	
	var calHeader = document.CreateElementExt("tr");
	theader.appendChild(calHeader);
	calHeader.appendChild(document.CreateElementExt("th", {"class":"back"}, null, "<div></div>"));
	calHeader.appendChild(document.CreateElementExt("th", {colSpan:5, colspan:5}));
	calHeader.appendChild(document.CreateElementExt("th", {"class":"forward"}, null, "<div></div>"));
	
	var back = function()
	{
		popup.ShowDate = new Date(popup.ShowDate.getFullYear(), popup.ShowDate.getMonth() - 1, 1);
		calHeader.cells[1].innerHTML = String.Format("{0:MMMM yyyy}", popup.ShowDate);
		DateTime.DrawMonth(tbody, popup.ShowDate, popup.SelectedDate)
	};
	document.AddEventListener(calHeader.cells[0].childNodes[0], "onmousedown", back);
	
	var forward = function()
	{
		popup.ShowDate = new Date(popup.ShowDate.getFullYear(), popup.ShowDate.getMonth() + 1, 1);
		calHeader.cells[1].innerHTML = String.Format("{0:MMMM yyyy}", popup.ShowDate);
		DateTime.DrawMonth(tbody, popup.ShowDate, popup.SelectedDate)
	};
	document.AddEventListener(calHeader.cells[2].childNodes[0], "onmousedown", forward);
	
	var tr = document.CreateElementExt("tr");
	theader.appendChild(tr);
	for(var i = 1; i < 8; i++)
	{
		var day    = i % 7;
		var header = DateTime.Days[MultilingualHelper.CurrentUserLanguage][day];
		var th     = document.CreateElementExt("th", null, null, header);
		tr.appendChild(th);
	}
	var tbody = document.CreateElementExt("tbody");
	table.appendChild(tbody);
	var selectDay = function()
	{
		var e = document.RetrieveEvent();
		if (e.target.className.indexOf("DayOutMonth") != -1)
		{
			e.preventDefault();
			return;
		}
		var day = parseInt(e.target.innerHTML, 10);
		popup.SelectedDate  = new Date(popup.ShowDate.getFullYear(), popup.ShowDate.getMonth(), day);
		dateControl.value   = popup.SelectedDate.ToString("dd/MM/yyyy");
		//if (dateControl.fireEvent)
		//{//Check mootools pressence... 
		//	dateControl.fireEvent('change', {target:dateControl, type:'change'});
		//}
		popup.Hide();
	};
	document.AddEventListener(tbody, "onclick", selectDay);

	return popup;
};

DateTime.DrawMonth = function(parent, date, selectedDate)
{
	while(parent.childNodes.length > 0)
	{
		parent.removeChild(parent.childNodes[0])
	}
	var beginMonth  = new Date(date.getFullYear(), date.getMonth(), 1);
	var startCalendar;
	if (beginMonth.getDay() > 0)
	{
		startCalendar = new Date(date.getFullYear(), date.getMonth(), -beginMonth.getDay() + 2);
	}
	else
	{
		startCalendar = new Date(date.getFullYear(), date.getMonth(), -5);
	}
	var tr;
	for (var i = 0; i < 42; i++, startCalendar.setDate(startCalendar.getDate() + 1))
	{
		var td;
		if ((i % 7) == 0)
		{
			tr = document.CreateElementExt("tr");
			parent.appendChild(tr);
		}
		td = document.CreateElementExt("td", null, null, startCalendar.getDate())
		if (startCalendar.getMonth() != beginMonth.getMonth())
		{
			td.className += " DayOutMonth"; 
		}
		if ((startCalendar.getDay() == 0) || (startCalendar.getDay() == 6))
		{
			td.className += " WeekEnd"; 
		}
		if ((startCalendar.getDate() == DateTime.Today.getDate()) && (startCalendar.getMonth() == DateTime.Today.getMonth()) && (startCalendar.getFullYear() == DateTime.Today.getFullYear()))
		{
			td.className += " Today"; 
		}
		if ((startCalendar.getDate() == selectedDate.getDate()) && (startCalendar.getMonth() == selectedDate.getMonth()) && (startCalendar.getFullYear() == selectedDate.getFullYear()))
		{
			td.className += " Selected"; 
		}
		tr.appendChild(td);
	}
};

DateTime.ValidateDateBox = function()
{
	var invalid = document.getElementById(this.id + "_Invalid");
	var date    = DateTime.GetDateFromDateBox(this);
	if ((this.value.length != 0) && (isNaN(date)))
	{
		invalid.style.display = "";
	}
	else
	{
		if (!isNaN(date))
		{
			this.value = date.ToString("dd/MM/yyyy");
		}
		invalid.style.display = "none";
	}
};

DateTime.ShowCalendar = function()
{
	if (this.style.display != "none")
	{
		this.Hide();
		return;
	}
	
	if (this.parentNode != document.body)
	{
		document.body.appendChild(this);
	}
	var position    = document.GetElementPosition(this.DateControl);	
	this.style.left = position.Left + "px";
	this.style.top  = position.Top + position.Height + "px";
	var date        = DateTime.GetDateFromDateBox(this.DateControl);
	if (isNaN(date))
	{
		date = new Date();
	}
	this.childNodes[1].rows[0].cells[1].innerHTML = String.Format("{0:MMMM yyyy}", date);
	this.ShowDate     = date;
	this.SelectedDate = date;
	DateTime.DrawMonth(this.childNodes[1].childNodes[1], date, date)
	
	document.CancelBubble();
	document.AddEventListener(document, "onclick", this.Hide);	
	
	var ieFix = this.IeFix;
	var showFix = function()
	{
		ieFix.style.display = "";
	}
	ieFix.style.display = "none";
	document.Expand(this, this.getElementsByTagName("table")[0], showFix);
}

DateTime.HideCalendar = function()
{
	document.RemoveEventListener(document, "onclick", this.Hide);
	document.Collapse(this, this.getElementsByTagName("table")[0]);
};
