//<script>

document.write("<iframe style='display:none;position:absolute;width:148;height:194;z-index=100' id='kciFrameCalendar' marginheight='0' marginwidth='0' noresize frameborder='0' scrolling='no' src='/include/html/calendar.html'></iframe>");

function CreateCalendar(name, val, attribs, fmt, langID, style)
{
	var a = "";
	var v1 = "";

	if (fmt != "mdy" && fmt != "dmy" && fmt != "ymd" && fmt != "Mdy")
	{
		fmt = "mdy";
	}
	if (typeof attribs != "undefined" && attribs != null)
	{
		a = attribs;
	}
	if (a.match("size") == null)
	{
		a += " size='12'";
	}
	if (typeof langID == "undefined" || langID == null || langID.length == 0)
	{
		langID = "EN";
	}
	if (typeof val != "undefined" && val != null)
	{
		v1 = " value='" + dateToString(val, fmt, langID) + "'";
	}
	if (typeof style == "undefined" || style == null)
	{
		style = "";
	}
	document.write("<input type='text' name='" + name + "' " + a + v1 + " onblur='DoCalTextBlur(\"" + fmt + "\", \"" + langID + "\");' style='" + style + "'>" +
		"<img src='/include/images/misc/calendar.gif' border='0' vspace='2' hspace='0' align='absbottom' onclick='javascript:ToggleCalendar(\"" + fmt + "\", \"" + langID + "\", document.all[\"" + name + "\"]);'>\r\n");
}

function ToggleCalendar(fmt, langID, eD, val, dmin, dmax)
{
	var wF = window.frames.kciFrameCalendar;

	if (wF.IsActive(eD))
	{
		window.frames.kciFrameCalendar.Finalize();
	}
	else
	{
		wF.Initialize(0, fmt, langID, eD);
		if (typeof val != "undefined" && val != null)
		{
			wF.SetValue(val);
		}
	}
	event.cancelBubble = true;
}

//--------------------------------------------------------
// event handlers
//--------------------------------------------------------

function DoCalTextBlur(fmt, langID)
{
	var val = event.srcElement.value.replace(/(^\s*)|(\s*$)/g, "");

	if (val.length > 0 && validateDateString(val, fmt, langID) == null)
	{
		var fmtString;

		if (langID == "EN")
		{
			switch (fmt)
			{
				case "mdy" :
					fmtString = "mm/dd/yyyy";
					break;
				case "dmy" :
					fmtString = "dd/mm/yyyy";
					break;
				case "ymd" :
					fmtString = "yyyy/mm/dd";
					break;
				case "Mdy" :
					fmtString = "MMM dd, yyyy";
					break;
			}
			alert("Invalid date input. Please enter a valid date (" + fmtString + ").");
		}
		else
		{
			switch (fmt)
			{
				case "mdy" :
					fmtString = "mm/jj/aaaa";
					break;
				case "dmy" :
					fmtString = "jj/mm/aaaa";
					break;
				case "ymd" :
					fmtString = "aaaa/mm/jj";
					break;
				case "Mdy" :
					fmtString = "MMM jj, aaaa";
					break;
			}
			alert("Date non valable. Veuillez entrer une date valable (" + fmtString + ").");
		}
//		event.srcElement.focus();
		ToggleCalendar(fmt, langID, event.srcElement);
	}
}

/*function DoCalTextKeyDown()
{
	// if the del key was pressed
	if (event.keyCode == 46)
	{
		if (window.frames.kciFrameCalendar.IsActive(event.srcElement))
		{
			window.frames.kciFrameCalendar.SetValue(null);
		}
		else
		{
			event.srcElement.value = "";
		}
		event.cancelBubble = true;
	}
}*/


//--------------------------------------------------------
// utility functions
//--------------------------------------------------------
var fmtMonthENNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var fmtMonthFRNames = ["jan", "fév", "mar", "avr", "mai", "juin", "juil", "aoû", "sep", "oct", "nov", "déc"];

//--------------------------------------------------------
// validateDateString - validates a string and returns a date object
//   in:
//     dateString - string to be parsed for y, m, d values; format expected is: dd/mm/yyyy
//     fmt - format of the date string
//   returns:
//     date object if format is correct
//     null if format is incorrect
//--------------------------------------------------------
function validateDateString(dateString, fmt, langID)
{
	var dateValues = parseDateString(dateString, fmt, langID);
	var dateObj = null;
	if (dateValues != null && isValidDate(dateValues['year'], dateValues['month'], dateValues['day']))
	{
		dateObj = new Date(dateValues['year'], dateValues['month'], dateValues['day']);
	}
	return dateObj;
}

//--------------------------------------------------------
// isValidDate - returns true if the y, m, d combination is a valid date
//   in:
//     y - number of the full year
//     m - number of the month
//     d - number of the day
//   returns:
//     true if y, m, d combination is a valid date, otherwise false
//--------------------------------------------------------
function isValidDate(y, m, d)
{
	var valid = true;
	if (y < 0 || m > 11 || m < 0 || d < 1)
	{
		// check the bounds of year, month and lower bounds of day
		valid = false;
	}
	else
	{
		// check upper bounds of day within the month
		var dt;
		dt = new Date(Number(y), 1 + Number(m), 1, 0, 0, 0);
		dt.setDate(dt.getDate() - 1);
		if (dt.getDate() < d)
		{
			valid = false;
		}
	}
	return valid;
}

//--------------------------------------------------------
// parseDateString - parses a string for the y, m, d values
//   in:
//     dateString - string to be parsed for y, m, d values; format expected is: dd/mm/yyyy
//     fmt - format of the date string
//   returns:
//     associative array that contains 'year', 'month', 'day' members if format is correct
//     null if format is incorrect
//--------------------------------------------------------
function parseDateString(dateString, fmt, langID)
{
	var datePattern;
	var foundArray, yidx, midx, didx;
	var dateValues = null;
	var fmtMonthNames;

	if (langID == "EN")
	{
		fmtMonthNames = fmtMonthENNames;
	}
	else
	{
		fmtMonthNames = fmtMonthFRNames;
	}

	switch (fmt)
	{
		case "mdy" :
			datePattern = new RegExp('^\\s*([0-9]{1,2})[/]([0-9]{1,2})[/]([0-9]{4,})\\s*$');
			yidx = 3;
			midx = 1;
			didx = 2;
			break;
		case "dmy" :
			datePattern = new RegExp('^\\s*([0-9]{1,2})[/]([0-9]{1,2})[/]([0-9]{4,})\\s*$');
			yidx = 3;
			midx = 2;
			didx = 1;
			break;
		case "ymd" :
			datePattern = new RegExp('^\\s*([0-9]{4,})[/]([0-9]{1,2})[/]([0-9]{1,2})\\s*$');
			yidx = 1;
			midx = 2;
			didx = 3;
			break;
		case "Mdy" :
			datePattern = new RegExp('^\\s*([a-zA-Z]{3,})\\s+([0-9]{1,2})[,]\\s*([0-9]{4,})\\s*$');
			yidx = 3;
			midx = 1;
			didx = 2;
			break;
	}
	foundArray = datePattern.exec(dateString);

	if (foundArray != null)
	{
		dateValues = new Object();
		// populate associative array
		dateValues['year'] = Number(foundArray[yidx]);
		if (fmt == "Mdy")
		{
			var i;

			for (i = 0; i < fmtMonthNames.length && fmtMonthNames[i].toUpperCase() != foundArray[midx].substr(0, fmtMonthNames[i].length).toUpperCase(); i++)
			{
			}
			dateValues['month'] = i;
		}
		else
		{
			dateValues['month'] = -1 + Number(foundArray[midx]);
		}
		dateValues['day'] = Number(foundArray[didx]);
	}
	return dateValues;
}

//--------------------------------------------------------
// dateToString - converts a date to a string in the given format
//   in:
//     dt - date to be converted
//     fmt - format of the date string
//   returns:
//     string version of the date
//--------------------------------------------------------
function dateToString(dt, fmt, langID)
{
	var y = dt.getFullYear();
	var m = dt.getMonth() + 1;
	var d = dt.getDate();
	var dtString = "";

	if (dt != null)
	{
		switch (fmt)
		{
			case "mdy" :
				dtString = String(m + 100).substr(1) + "/" + String(d + 100).substr(1) + "/" + String(y);
				break;
			case "dmy" :
				dtString = String(d + 100).substr(1) + "/" + String(m + 100).substr(1) + "/" + String(y);
				break;
			case "ymd" :
				dtString = String(y) + "/" + String(m + 100).substr(1) + "/" + String(d + 100).substr(1);
				break;
			case "Mdy" :
				if (langID == "EN")
				{
					dtString = fmtMonthENNames[m - 1] + " " + String(d) + ", " + String(y);
				}
				else
				{
					dtString = fmtMonthFRNames[m - 1] + " " + String(d) + ", " + String(y);
				}
				break;
		}
	}
	return dtString;
}

