//
// (c) Travel Power Limited 2006
//
//
// Module Variables
//
var gbFORMDATESValidateLastChar=true;

var mdValid_Date;
var mdValid_FromDate;
var mdValid_ToDate;
var msValid_Value;
var msValid_Result;
var mnValid_Result = new Number;

var maDOW = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); //LANGUAGE-SPECIFIC

function gfCompareDates(firstDate, compareAs, lastDate)
{
	//alert("gfCompareDates\n"+firstDate+"\n"+compareAs+"\n"+lastDate)
	var lFirstDate = new Date();
	var lLastDate = new Date();

	if (typeof firstDate == "string")
	{
		lFirstDate = gdValidDateFromString(firstDate);
		lFirstDate.setTime(lFirstDate.getTime()+60000*60*11);
	}
	else
		lFirstDate = firstDate;

	if (typeof lastDate == "string")
	{
		lLastDate = gdValidDateFromString(lastDate);
		lLastDate.setTime(lLastDate.getTime()+60000*60*11);
	}
	else
		lLastDate = lastDate;

	//alert(lFirstDate+"\n"+lLastDate);

	lFirstDate.setUTCHours(11,0,0,0);
	lLastDate.setUTCHours(11,0,0,0);
	
	// alert(lFirstDate+"\n"+lLastDate);
	if (compareAs == "<")
	{
		if (lFirstDate < lLastDate)
			return(true);
		else
			return(false);
	}
	
	if (compareAs == ">")
	{
		if (lFirstDate > lLastDate)
			return(true);
		else
			return(false);
	}
	
	return(false);
}

function gTPFORMDATESToDayOfWeek(inDate)
{
	return(maDOW[inDate.getDay()]);
}

function gbValidTimeOnSubmit(thisControl, abMandatory, asFieldName)
{
	msValid_Value = thisControl.value;
	if (msValid_Value == "")
	{
		if (abMandatory == false) return(true);
		alert(asFieldName + ": must contain a time (hh:mm)");
		thisControl.focus();
		return(false);
	}

	msValid_Result = gsValidValidateTime(msValid_Value);

	if (msValid_Result == "")
	{
		alert(asFieldName + ": '" + msValid_Value + "' is not a time (hh:mm)");
		thisControl.focus();
		return(false);
	}
	else 
	{
		thisControl.value = msValid_Result;
		return(true);
	}
}

function gfFormatShortTimeOnBlur()
{
	try {gfClearStatus();}
	catch(er) {}
	
	if (window.event.srcElement.value == "") return(false);
	var tempVal = gsValidValidateTime(window.event.srcElement.value);
	if (tempVal == "") return(false);
	else window.event.srcElement.value = tempVal;
	return(true);
}

function gsValidValidateTime(asTime)
{
	var tempStr = String(asTime);
	var tempStr2 = String(asTime);
	if (tempStr.length == 4)
	{
		tempStr = tempStr2.substring(0, 2) + ":" + tempStr2.charAt(2) + tempStr2.charAt(3);
	}
	if (tempStr.length != 5)
		return("");

	dateArray = gaValidSplitString(tempStr, ":");
	if (dateArray.length != 2) return("");

	var lnElement = new Number;
	lnElement = parseInt(dateArray[0], 10);
	if (lnElement < 0 || lnElement > 23) return("");

	if (lnElement < 10 ) tempStr = "0" + lnElement + ":";
	else tempStr = lnElement + ":";

	lnElement = parseInt(dateArray[1], 10);
	if (lnElement < 0 || lnElement > 59) return("");

	if (lnElement < 10 ) tempStr += "0" + lnElement;
	else tempStr += lnElement;

	return(tempStr);
}

function gbValidShortDateOnSubmit(thisControl, abMandatory, asFieldName)
{
	/// <summary>Does the Control contain a date?</summary>
	/// <param name="thisControl" type="string">Id of the Control</param>
	/// <param name="abMandatory" type="boolean">Mandatory</param>
	/// <param name="asFieldName" type="string">Prompt Text</param>
	/// <returns type="boolean">True/False</returns>

	//alert("gbValidShortDateOnSubmit");
	if (typeof thisControl == "string") thisControl = document.getElementById(thisControl);

	if (thisControl == null)
		msValid_Value = "";
	else
		msValid_Value = thisControl.value;
		
	mdValid_Date = "";
	
	if (msValid_Value == "")
	{
		if (abMandatory == false) return(true);
		alert(asFieldName + ": must contain a date");
		thisControl.focus();
		return(false);
	}

	msValid_Result = gsValidValidateShortDate(msValid_Value);

	if (msValid_Result == "")
	{
		alert(asFieldName + ": '" + msValid_Value + "' is not a date");
		thisControl.focus();
		return(false);
	}
	else
	{
		thisControl.value = msValid_Result;
		return(true);
	}
}

function gbValidDateRangeOnSubmit(ainputControl1, abMandatory1, asFieldName1, ainputControl2, abMandatory2, asFieldName2, compareAs)
{
	/// <summary>Does the Control contain a date?</summary>
	/// <param name="ainputControl1" type="string">Id of the 'From' Date Control or the Control object</param>
	/// <param name="abMandatory1" type="boolean">Mandatory</param>
	/// <param name="asFieldName1" type="string">Prompt Text</param>
	/// <param name="ainputControl2" type="string">Id of the 'To' Date Control or the Control object</param>
	/// <param name="abMandatory2" type="boolean">Mandatory</param>
	/// <param name="asFieldName2" type="string">Prompt Text</param>
	/// <param name="compareAs" type="string">'<' = Less Than, otherwise Less Than or Equal</param>
	/// <returns type="boolean">True/False</returns>

	if (typeof ainputControl1 == "string") ainputControl1 = document.getElementById(ainputControl1);
	if (typeof ainputControl2 == "string") ainputControl2 = document.getElementById(ainputControl2);

	if (gbValidShortDateOnSubmit(ainputControl1, abMandatory1, asFieldName1) == false)
		return(false);

	mdValid_FromDate = mdValid_Date;
	lResult=msValid_Result;
		
	if (gbValidShortDateOnSubmit(ainputControl2, abMandatory2, asFieldName2) == false)
		return(false);
		
	mdValid_ToDate = mdValid_Date;

	if (compareAs=="<")		
	{
		if (mdValid_ToDate < mdValid_FromDate)
		{
			alert("'" + asFieldName2 + "' " + msValid_Result + " cannot be before '" + asFieldName1 + "' " + lResult);
			ainputControl2.focus();
			return(false);
		}
	}
	else
	{
		if (mdValid_ToDate <= mdValid_FromDate)
		{
			alert("'" + asFieldName2 + "' " + msValid_Result + " must be after '" + asFieldName1 + "' " + lResult);
			ainputControl2.focus();
			return(false);
		}
	}
	return(true);
}

function gfFormatShortDateOnBlur()
{
	try {gfClearStatus();}
	catch(er) {}
	
	if (window.event.srcElement.value == "") return(false);
	var tempVal = gsValidValidateShortDate(window.event.srcElement.value);
	if (tempVal == "") return(false);
	else window.event.srcElement.value = tempVal;
	return(true);
}

function gfValidFormatDateAndDOW(avInputDate, avSpanDOW)
{
	if (document.getElementById(avInputDate).value == "") 
	{
		document.getElementById(avSpanDOW).innerHTML = "&nbsp;";
		return(false);
	}
		
	var tempVal = gsValidValidateShortDate(document.getElementById(avInputDate).value);
	if (tempVal == "")
	{ 
		document.getElementById(avSpanDOW).innerHTML = "?";
		return(false);
	}
	
	document.getElementById(avInputDate).value = tempVal;
	document.getElementById(avSpanDOW).innerHTML = gTPFORMDATESToDayOfWeek(mdValid_Date);
}


function gTPFORMDATESAddToDate(startDate, numDays, numMonths, numYears)
{
	if (startDate == "")
		return("");

	var yearsToAdd;
	var monthsToAdd;
	var daysToAdd;
			
	var returnDate = new Date(startDate.getTime());
	var lTimezoneOffset = returnDate.getTimezoneOffset();
	//alert("getTimezoneOffset:"+lTimezoneOffset);

	if (numYears== null)
		{yearsToAdd = 0;}
	else
		{yearsToAdd = numYears;}
	if (numMonths== null)
		{monthsToAdd = 0;}
	else
		{monthsToAdd = numMonths;}
	if (numDays== null)
		{daysToAdd= 0;}
	else
		{daysToAdd = numDays;}

	var month = returnDate.getMonth() + monthsToAdd;
	if (month > 11)
	{
		var ExtrayearsToAdd = Math.floor((month+1)/12);
		month -= 12*ExtrayearsToAdd;
		yearsToAdd += ExtrayearsToAdd;
	}
	returnDate.setMonth(month);
	returnDate.setFullYear(returnDate.getFullYear()	+ yearsToAdd);

	returnDate.setTime(returnDate.getTime()+60000*60*24*daysToAdd);
	//alert("getTimezoneOffset:"+returnDate+" - "+returnDate.getTimezoneOffset());
	returnDate.setTime(returnDate.getTime()-(60000*lTimezoneOffset));
	//alert("getTimezoneOffset:"+returnDate+" - "+returnDate.getTimezoneOffset());

	return returnDate;
}

function gfDateAsSelectedValue(thisDate)
{
	var lDate = new Date()
	if (typeof thisDate=="string")
		lDate = gdValidDateFromString(thisDate);
	else
		lDate = thisDate;

	return((lDate.getMonth()+1)+"-"+lDate.getFullYear());
}

function gfDateAsSelectedLabel(thisDate)
{
	var lDate = new Date()
	if (typeof thisDate=="string")
		lDate = gdValidDateFromString(thisDate);
	else
		lDate = thisDate;

	return(gsValidNumberToMonth(lDate.getMonth())+" "+lDate.getFullYear());
}

function gnValidMonthToNumber(inMonth)
{
	var lMonthNames = new Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"); //LANGUAGE-SPECIFIC
	inMonth = inMonth.toUpperCase();

	for (monthSearch = 0; monthSearch < 12; monthSearch++)
	{
		if (inMonth == lMonthNames[monthSearch])
		{
			return(monthSearch);
		}
	}
	return;
}

function gsValidNumberToMonth(inMonth)
{
	var lMonthNames = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); //LANGUAGE-SPECIFIC
	return(lMonthNames[inMonth]);
}

function gdValidDateFromString(thisDate)
{
	if (gsValidValidateShortDate(thisDate) == "")
		return(thisDate);
	else
		return(mdValid_Date);
}

function gsFormatSQLDate(thisDate)
{
	if (gsValidValidateShortDate(thisDate) == "")
		return(thisDate);

	var outputDay = String(mdValid_Date.getDate());
	if (outputDay.length == 1) outputDay = "0" + outputDay;

	var outputMonth = String(mdValid_Date.getMonth()+1);
	if (outputMonth.length == 1) outputMonth = "0" + outputMonth;
	
	var outputYear = String(mdValid_Date.getFullYear());
	
	outputDate = outputYear + '-' + outputMonth + '-' + outputDay;
	
	return(outputDate);
}

function gsValidValidateShortDate(inDate)
{
	var tempStr = String(inDate);

	var dateArray = gaValidSplitString(tempStr, ".");
	if (!dateArray[2]) {var dateArray = gaValidSplitString(tempStr, " ");}
	if (!dateArray[2]) {var dateArray = gaValidSplitString(tempStr, "-");}
	if (!dateArray[2]) {var dateArray = gaValidSplitString(tempStr, "/");}
	if (!dateArray[2]) {var dateArray = gaValidSplitString(tempStr, ",");}
	
	if (!dateArray[2])
	{
		if (tempStr.length==6)
			var dateArray = gaValidSplitString(tempStr.substr(0, 2)+","+tempStr.substr(2, 2)+","+tempStr.substr(4), ",");
		if (tempStr.length==7)
			var dateArray = gaValidSplitString(tempStr.substr(0, 2)+","+tempStr.substr(2, 3)+","+tempStr.substr(5), ",");
	} 

	if (!dateArray[2])
		return("");
		
	if (dateArray[2].length == 1) {dateArray[2] = "200" + dateArray[2];}
	else if (dateArray[2].length == 2) {dateArray[2] = "20" + dateArray[2];}
	else if (dateArray[2].length != 4) return("");

	if ((dateArray[0] < 1) || (dateArray[0] > 31)) return("");
	if ((dateArray[1] < 1) || (dateArray[1] > 12)) return("");

	if (isNaN(dateArray[1])) mdValid_Date = new Date(dateArray[2], gnValidMonthToNumber(dateArray[1]), dateArray[0]);
	else mdValid_Date = new Date(dateArray[2], dateArray[1]-1, dateArray[0]);

	if (isNaN(mdValid_Date)) return("");

	var outputDate = String(mdValid_Date.getDate());
	tempStr = String(mdValid_Date.getFullYear());
	//alert(">"+tempStr+"<");
	tempStr = tempStr.substr(2,2);
	
	if (parseInt(dateArray[0],10) != parseInt(outputDate,10))
			return("");

	if (outputDate.length == 1) outputDate = "0" + outputDate;
	outputDate = outputDate + '-' + gsValidNumberToMonth(mdValid_Date.getMonth()) + '-' + tempStr; //LANGUAGE-SPECIFIC (seperators)
	
	return(outputDate);
}

function gsValidDateAsDate(thisDate)
{
	var outputDate = String(thisDate.getDate());
	tempStr = String(thisDate.getFullYear()).substr(2,2);
	//tempStr = tempStr.substr(2,2);
	
	if (outputDate.length == 1) outputDate = "0" + outputDate;
	outputDate = outputDate + '-' + gsValidNumberToMonth(thisDate.getMonth()) + '-' + tempStr; //LANGUAGE-SPECIFIC (seperators)
	return(outputDate);
}

function gaValidSplitString(inString, splitBy)
{
	var i = 0;
	var returnArray = new Array();
	var stringPart = new String;
	while ((inString.length > 0) && (i < 20))
	{
		if (inString.indexOf(splitBy) == -1)
		{
			stringPart = inString.substring(0, inString.length);
			inString = "";
		}
		else
		{
			stringPart = inString.substring(0, inString.indexOf(splitBy));
			inString = inString.substring(inString.indexOf(splitBy) + 1, inString.length);
		}
		if (stringPart != "")
		{
			returnArray[i] = stringPart;
			i++;
		}
	}
	return(returnArray);
}
var one_day=1000*60*60*24;
var one_month=1000*60*60*24*30;
var one_year=1000*60*60*24*30*12;

var gValidDateDisplayAgeAtDate=new Date();

function gsValidDateDisplayAge(thisDateString, unit, thisDecimal, round)
{
	if (thisDateString=="")
		return("");
		
	//var pastdate=new Date(pastdate.getFullYear(), pastdate.getMonth()-1, day)
	var pastdate=gdValidDateFromString(thisDateString);
	
	//alert("'"+thisDateString+"'\n'"+pastdate+"'\n'"+gValidDateDisplayAgeAtDate+"'");
	
	if (pastdate>gValidDateDisplayAgeAtDate)
		pastdate.setYear(pastdate.getFullYear()-100);
		
	if (!thisDecimal)
		thisDecimal=0;
	if (!round)
		round=0;
		
	var countunit=unit
	var decimals=thisDecimal
	var rounding=round
	
	finalunit=(countunit=="days")? one_day : (countunit=="months")? one_month : one_year
	decimals=(decimals<=0)? 1 : decimals*10
	
	if (unit!="years")
	{
		if (rounding=="rounddown")
			return(Math.floor((gValidDateDisplayAgeAtDate.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals+" "+countunit)
		else
			return(Math.ceil((gValidDateDisplayAgeAtDate.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals+" "+countunit)
	}
	else
	{
		//alert(pastdate);
		yearspast=gValidDateDisplayAgeAtDate.getFullYear()-pastdate.getFullYear()-1;
		//alert(yearspast);

		tail=(gValidDateDisplayAgeAtDate.getMonth()>pastdate.getMonth() || gValidDateDisplayAgeAtDate.getMonth()==pastdate.getMonth() && gValidDateDisplayAgeAtDate.getDate()>=pastdate.getDate())? 1 : 0
		yearspast+=tail;
		return(yearspast);

		//pastdate.setFullYear(gValidDateDisplayAgeAtDate.getFullYear())
		//pastdate2=new Date(gValidDateDisplayAgeAtDate.getFullYear()-1, pastdate.getMonth(), pastdate.getDate())
		//tail=(tail==1)? tail+Math.floor((gValidDateDisplayAgeAtDate.getTime()-pastdate.getTime())/(finalunit)*decimals)/decimals : Math.floor((gValidDateDisplayAgeAtDate.getTime()-pastdate2.getTime())/(finalunit)*decimals)/decimals
		//return(yearspast+tail+" "+countunit);
	}
}



