<!--
/*
	' /////////////////////////////////////////////////////////////////////////
	' Copyright (c) 1998-2006 Mobigator Technology Group.  ALL RIGHTS RESERVED.
	' 
	' Unauthorized use of any portion of the code below without prior written 
	' authorization of Mobigator Technology Group is straightly prohibited.
	' 
	' For licensing information, please contact info@mobigator.com
	'//////////////////////////////////////////////////////////////////////////
*/
//-->
function FormatDateTime(datetime, FormatType)
/*
	 FomatType takes the following values
		1 - Fri, Oct 30, 2003
		2 - 10/30/03
		3 - 6:31 PM
		4 - 18:31
		5 - Fri Oct 30, 2003 18:31:01
		6 - Fri, 30 Oct 2003
*/
	
{
	var fmt;

	if (FormatType == 1) {
		fmt = "%w, %M %d, %Y";
	}
	else if (FormatType == 2) {
		fmt = "%m/%d/%y";
	}
	else if (FormatType == 3) {
		fmt = "%h:%n %a";
	}
	else if (FormatType == 4) {
		fmt = "%H:%n";
	}
	else if (FormatType == 5) {
		fmt = "%w, %M %d, %Y %T";
	}
	else if (FormatType == 6) {
		fmt = "%w, %d %M %Y";
	}
	else if (FormatType == 7) {
		fmt = "%d/%m/%y";
	}

	return FormatDateTimeEx(datetime, fmt)
}

function FormatDateTimeEx(datetime, fmt)
/*
		Oct 30, 2005
		%w - Fri
		%m - 10
		%M - Oct
		%Y - 2005
		%y - 05
		%d = 30
		%a - AM/PM
		%T - 16:31
*/
{
	
	var strDate = new String(datetime);

	if (strDate.toUpperCase() == "NOW") {
		var myDate = new Date();
		strDate = String(myDate);
	} else {
		var myDate = new Date(datetime);
		strDate = String(myDate);
	}

	// Get the date variable parts
	var Day = new String(strDate.substring(0,3));
	var Month = new String(strDate.substring(4,7));

	var curPos = 11;
	var MonthDay = new String(strDate.substring(8,10));
	if (MonthDay.charAt(1) == " ") {
		MonthDay = "0" + MonthDay.charAt(0);
		curPos--;
	}	

	var Time = new String(strDate.substring(curPos,curPos + 8));
	var Year = new String(strDate.substring(strDate.length - 4, strDate.length));	
	
	var s = fmt;
	
	s = replaceSubstring(s, "%M", "" + Month);
	s = replaceSubstring(s, "%m", "" + MonthNumber(Month));
	s = replaceSubstring(s, "%d", "" + MonthDay);
	s = replaceSubstring(s, "%w", "" + Day);
	s = replaceSubstring(s, "%Y", "" + Year);
	s = replaceSubstring(s, "%y", "" + Year.substring(2,4));
	s = replaceSubstring(s, "%H", "" + Time.substring(0,2));
	s = replaceSubstring(s, "%h", "" + (Time.substring(0,2) >= 12 ? Time.substring(0,2) : (Time.substring(0,2) - 12)));
	s = replaceSubstring(s, "%n", "" + Time.substring(3,5));
	s = replaceSubstring(s, "%s", "" + Time.substring(7,9));
	s = replaceSubstring(s, "%a", "" + (Time.substring(0,2) >= 12 && Time.substring(0,2) != "24" ? " PM" : " AM"));
	s = replaceSubstring(s, "%T", "" + Time);
	
	return s;
}

function FullDay(Day)
{
	var d;
	
	if (Day == "Sun") d = "Sunday";
	if (Day == "Mon") d = "Monday";
	if (Day == "Tue") d = "Tuesday";
	if (Day == "Wed") d = "Wednesday";
	if (Day == "Thu") d = "Thursday";
	if (Day == "Fri") d = "Friday";
	if (Day == "Sat") d = "Saturday";	
	
	return d;
}

function FullMonth(Month)
{
	var m; 
	if (Month == "Jan") { m = "January"; }
	if (Month == "Feb") { m = "February"; }
	if (Month == "Mar") { m = "March"; }
	if (Month == "Apr") { m = "April"; }
	if (Month == "May") { m = "May"; }
	if (Month == "Jun") { m = "June"; }
	if (Month == "Jul") { m = "July"; }
	if (Month == "Aug") { m = "August"; }
	if (Month == "Sep") { m = "September"; }
	if (Month == "Oct") { m = "October"; }
	if (Month == "Nov") { m = "November"; }
	if (Month == "Dec") { m = "December"; }
	return m;
}

function MonthNumber(Month)
{
	var m;
	
	if (Month == "Jan") { m = 1; }
	if (Month == "Feb") { m = 2; }
	if (Month == "Mar") { m = 3; }
	if (Month == "Apr") { m = 4; }
	if (Month == "May") { m = 5; }
	if (Month == "Jun") { m = 6; }
	if (Month == "Jul") { m = 7; }
	if (Month == "Aug") { m = 8; }
	if (Month == "Sep") { m = 9; }
	if (Month == "Oct") { m = 10; }
	if (Month == "Nov") { m = 11; }
	if (Month == "Dec") { m = 12; }
	
	return m;
}

function GetNumberOfMonth(startDt, endDt)
{	
	var startDtObj	= new Date(startDt)
	var endDtObj	= new Date(endDt)
		
	// assume endDt > startDt
	if ( endDtObj < startDtObj ) {
		//alert(" End Date > start Date ")
		return 0
	}
	
	var nextMonth = GetNextMonthNextDay(startDtObj);
		
	// check whether within one month
	if ( DateDiff(nextMonth, endDtObj) > 1 ){
		
		/***
		// more than one month		
		var preMonth = GetPreviousMonthOfDay(endDtObj);
		
		var count = 1;
		while ( DateDiff(startDtObj, preMonth) > 1  ) {
			//alert(preMonth);
			count++;
			preMonth = GetPreviousMonthOfDay(preMonth);
			
			alert(preMonth);
			
		}
		
		if (DateDiff(preMonth,startDtObj) == 1) {
			return count;
		}else{
			count = count - 1;
			return (DateDiff( startDtObj , GetNextMonthNextDay(preMonth))/GetDaysInMonth(startDtObj)) + count;
			return 1;
		}		
		**/
		
	}else if(DateDiff(endDtObj,nextMonth) == 1){
		return 1;
	}else{
		// within month	
		return DateDiff( startDtObj , endDtObj)/GetDaysInMonth(startDtObj);
	}
	
	/**
	all use por-rate calculation here
	var thisMon = GetDaysInMonth(startDtObj)				
	var lastDtObj = GetLastDayOfMonth(startDtObj)
		
	if ( lastDtObj < endDtObj ) {	
		var nextStartDt = new Date(startDtObj)
		nextStartDt.setMonth(startDtObj.getMonth()+ 1)				// next month
		nextStartDt.setDate(1)	
		return ( DateDiff( startDtObj , lastDtObj) / thisMon)  + GetNumberOfMonth(nextStartDt, endDtObj)
	}else{
		return DateDiff( startDtObj , endDtObj) / thisMon
	}
	**/
}

function GetNextMonthNextDay(objDate){

	var year, month	
	
	if ( objDate.getMonth() + 1 > 12 ){
		month = 0;
		year = objDate.getYear() + 1;
	}else {
		month = objDate.getMonth() + 1 ;
		year = objDate.getYear();
	}	
	
	var nextMonthObj = new Date( (month+1) + '/' + objDate.getDate() + '/' + year);
	
	return nextMonthObj;
	
}

function DateAdd(objDate, intDays)
{
  var iSecond=1000;	 // Dates are represented in milliseconds
  var iMinute=60*iSecond;
  var iHour=60*iMinute;
  var iDay=24*iHour;
  var objReturnDate=new Date();
  objReturnDate.setTime(objDate.getTime()+(intDays*iDay));
  return objReturnDate;
}

// return from  0 -> 11
function GetPreviousMonthOfDay(objDate)
{
	// previous month
	var year, month, day
	
	// previosu month
	if ( objDate.getMonth() - 1 < 0 ){
		month = 11;
		year = objDate.getYear() - 1;
	}else {
		month = objDate.getMonth() - 1;
		year = objDate.getYear();
	}
	
	var preMonthObj = new Date( (month+1) + '/' + objDate.getDate() + '/' + year);
	
	return preMonthObj;
}

// month 1 - 12
function GetDaysInMonthEx(month, year)
{
	//alert(month)
	//alert(year)
	var s = (JSIsUsingMDY ? (month + '/' + 1 + '/' + year) : (1 + '/' + month + '/' + year) )
	var last_day = new Date(GetLastDayOfMonth(new Date(s)))	
	//alert(last_day.getDate())
	return last_day.getDate()
}

// get a Date object which is last day in the month of the input Date object
function GetDaysInMonth(dtObj)
{	var last_day = new Date(GetLastDayOfMonth(dtObj))
	return last_day.getDate()	
}

// get a Date object which is last day in the month of the input Date object
function GetLastDayOfMonth(dt)
{
	var last_day = new Date(dt)		
	last_day.setMonth(last_day.getMonth()+ 1)				// next month
	last_day.setDate(1)										// first day of next month
	last_day.setTime(last_day.getTime() - GetOneDayTime())	// last day of this month

	return last_day
}

function GetOneDayTime()
{
	return 1 * 24 * 60 * 60 * 1000 
}


// calculate the different in day
function DateDiff(dt1, dt2) 
{

	var date1 =new Date(dt1)
	var date2 =new Date(dt2)
	
	var diff = ((date2.getTime() - date1.getTime()) / 1000 / 60 / 60 / 24) + 1
	
	return diff
}

function DateOnChangeAction(dateObj, i)
{	
	if ( Trim(dateObj.value).length == 0 ){
		dateObj.value = ""		
	} else {	
		DateCompletion(dateObj)
	}
	
	UpdateMRCInvoicePayment(i)
	UpdateTotalValue()	
}

// for auto date completion
function DateCompletion(inputName)
{	
	DateCompletionEx(inputName, true)
}

function DateCompletionEx(inputName, bMDY)
{	
	return DateCompletionEx3(inputName, bMDY, false)
}

function DateCompletionEx3(inputName, bMDY, checkSmallestYear )
{
	return DateCompletionEx4(inputName, bMDY, checkSmallestYear, false)
	
}
// checkSmallestYear : the smallest year is 1753 for database limit
function DateCompletionEx4(inputName, bMDY, checkSmallestYear, bPadZeroFroDM )
{
	if (inputName && inputName.value && inputName.value.length > 0) {
				
		var d = MyParseDateEx( inputName.value, bMDY )

		// if year less than 1753, this cause database error for type "datetime"
		if (d) 
		{
			if ( checkSmallestYear && ( d.getFullYear() < 1753 ) )
			{	
				alert("Please check the year in date entry: " + d.getFullYear() );
				inputName.focus();
				inputName.select();
				return false;
			}
		}	
		
		var val = FormatDateEx(d, bMDY, bPadZeroFroDM)
		
		if ( val  == '' )
		{
			inputName.focus();
			inputName.select();
			return false;
		}
		else 
		{
			inputName.value = val;
			return true;
		}
	}
	
	return true;
}


function IsLeapYear(year) {
	if ((year/4)   != Math.floor(year/4))   return false;
	if ((year/100) != Math.floor(year/100)) return true;
	if ((year/400) != Math.floor(year/400)) return false;
	return true;
}

//find the number of days in a month, note the month will start from 1
function FindNumberOfDaysInSpecificMonth(year, month)
{
	var days_per_month   = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if(IsLeapYear(year))
		days_per_month[1] = 29;

	return days_per_month[month-1];
}

function padZeroForDate(value)
{
	if(isFinite(parseInt(value)) && parseInt(value) < 10  ){
		value = parseInt(value);
		value="0"+value;
	}

	return value;
}

//allow only FOUR date formats, YYYY MM, YYYY MM DD, DD MM YYYY, MM YYYYY

function forceConvertDate(inputDate)
{
	var date, month, year;
	var dmy;
	
	var IsValidDate=true;
	var finalOutputDate;

	var dateField = "[0-3]?[0-9]";
	var monthField = "[0-1]?[0-9]";
	var yearField = "[1-2][0-9]{3}";
	var spaceField = "\\s*";
	var startField = "^"+spaceField;
	var endField= spaceField+"$";
	var separator = spaceField+"[/\\-\\. ]"+spaceField;

	var format1 = new RegExp(startField+dateField+separator+monthField+separator+yearField+endField);	//DD MM YYYY
	var format2 = new RegExp(startField+monthField+separator+yearField+endField); //MM YYYY
	var format3 = new RegExp(startField+yearField+separator+monthField+separator+dateField+endField);	//YYYY MM DD
	var format4 = new RegExp(startField+yearField+separator+monthField+endField);	//YYYY MM
	var sepFormat = new RegExp(separator);



	if ( format1.exec(inputDate) ) //DD MM YYYY
	{	
		dmy = inputDate.split(sepFormat);
		day = dmy[0]; month = dmy[1]; year = dmy[2];
	}
	else if ( format2.exec(inputDate) )	//MM YYYY
	{
		dmy = inputDate.split(sepFormat);
		month = dmy[0]; year = dmy[1];
		day = FindNumberOfDaysInSpecificMonth(year, month);
	}
	else if ( format3.exec(inputDate) ) //YYYY MM DD
	{
		dmy = inputDate.split(sepFormat);
		year = dmy[0]; month = dmy[1]; day = dmy[2]; 
	}
	else if ( format4.exec(inputDate) ) //YYYY MM
	{
		dmy = inputDate.split(sepFormat);
		year = dmy[0]; month = dmy[1]; 
		day = FindNumberOfDaysInSpecificMonth(year, month);
	}
	else
	{
		IsValidDate=false;
	}

	if ( IsValidDate )
	{
		finalOutputDate = padZeroForDate(day)+"/"+padZeroForDate(month)+"/"+year;
	}
	else
	{
		finalOutputDate = "";
	}



	return finalOutputDate;
}


function DateCompletionEx2(inputName, bMDY, robustConvert)
{
	if (inputName && inputName.value && inputName.value.length > 0) {
		if(robustConvert){
			convertedResult = forceConvertDate(inputName.value);
			if(convertedResult){
				inputName.value = convertedResult;	//change the value, so the later part can parse
			}
		}
		
		var val = MyParseDate(inputName.value, bMDY);		
		if ( val  == '' ) 
		{
			inputName.focus();
			inputName.select();
			return false;
		}
		else 
		{
			inputName.value = val;
			return true;
		}
	}
	
	return true;
}

function DateTimeCompletion(inputName, bMDY, defaultTime, bRoundToMin)
{	
	if (inputName && inputName.value && (inputName.value.length > 0)) {
		dateTime = inputName.value.trim().split(" ");
		date = dateTime[0];		
		if (dateTime.length > 1) 
		{ 
			time = dateTime[1]; 
		}else
		{
			time = defaultTime;
		}
		
		time = IsValidTimeStr(time, bRoundToMin)? time : defaultTime;
		
		var d = MyParseDateEx(date, bMDY);
		// if year less than 1753, this cause database error for type "datetime"
		if (d) 
		{
			if (d.getFullYear() < 1753)
			{	
				alert("Please check the year in date entry: " + d.getFullYear() );
				inputName.focus();
				inputName.select();
				return false;
			}
		}	
		
		var val = FormatDate(d, bMDY)
		
		if (val == '')
		{
			inputName.focus();
			inputName.select();
			return false;
		}
		else 
		{
			inputName.value = val + " " + time;
			return true;
		}
	}
	
	return true;
}

function IsValidTimeStr(time, bRoundToMin)
{
	var exp;
	if (bRoundToMin)
	{
		exp = "^([0-1][0-9]|[2][0-3]):([0-5][0-9])$";
	}else
	{
		exp = "^([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$";
	}
	var re = new RegExp(exp);
	return time.match(re);
}

function FormatDate(d, bMDY)
{
	return FormatDateEx(d, bMDY, false);
}

function FormatDateEx(d, bMDY, padZeroForDM)
{
	var s	= "";
	
	if (d) {
		var dd	= d.getDate();
		var mm	= (d.getMonth() + 1);
		
		if (padZeroForDM)
		{
			dd = padZeroForDate(dd);
			mm = padZeroForDate(mm);
		}
	 
		if (bMDY) { 
			s = "" + mm + "/" + dd + "/" + d.getFullYear();
		}
		else {
			s = "" + dd + "/" + mm + "/" + d.getFullYear();
		}
	}
	
	return s;
}



// parse date format string from m/d/y, m/d or d to m/d/y 
function MyParseDate(dt, bMDY)
{	
	var d = MyParseDateEx(dt, bMDY)
	var s = FormatDate(d, bMDY)
	return s;
}

function MyParseDateEx(dt, bMDY)
{
	var today = new Date()
	var splitDate= dt.split("/")
	var m, d, y	

	if (splitDate.length == 3) {
		if (bMDY) {
			m = splitDate[0]
			d = splitDate[1]
			y = splitDate[2]
		}
		else { 
			d = splitDate[0]
			m = splitDate[1]
			y = splitDate[2]
		}
	}
	else if (splitDate.length == 2) {
		if (bMDY) {
			m = splitDate[0]
			d = splitDate[1]
		}
		else {
			d = splitDate[0]
			m = splitDate[1]
		}
		y = today.getFullYear()	
	}
	else if (splitDate.length == 1) {
		// assume d
		d = splitDate[0]
		m = today.getMonth() + 1
		y = today.getFullYear()	
	}
	else {
		m = today.getMonth() + 1
		d = today.getDate()
		y = today.getFullYear()
	}

	if ((0+m) <= 0) m = today.getMonth() + 1
	if ((0+d) <= 0) d = today.getDate()
	if ((0+y) <= 0) y = today.getFullYear()

	// if year is less than 30, then assume it mean 20xx
	if (y < 30) y = 2000 + parseInt(y, 10);

	if (m > 12 || d > 31 || y > (today.getFullYear() + 100)) {
		alert("Invalid date entry: " + dt);
		return null;
	}
	
	var s = (JSIsUsingMDY ? (m + '/' + d + '/' + y) : (d + '/' + m + '/' + y) )

	return new Date(s);
}

function JSIsUsingMDY()
{
	var dt = new Date('1/7/2004');
	return (dt.getMonth() == 1)
}

function IsValidDate(dateStr) {
	// Checks for the following valid date formats:
	// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
	// Also separates date into month, day, and year variables

	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

	// To require a 4 digit year entry, use this line instead:
	// var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) {
		alert("Date is not in a valid format.")
		return false;
	}

	month = matchArray[1]; // parse date into variables
	day = matchArray[3];
	year = matchArray[4];
	
	if (month < 1 || month > 12) { // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}

	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}

	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		alert("Month "+month+" doesn't have 31 days!")
		return false
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) {
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
		}
	}
	return true;  // date is valid
}

// link two date control together such that 
// if the start date is changed, the end date will be updated automatically
function LinkedDateInput(startObj, endObj, minDt, maxDt, interval, diff, bAdjustOneDay, bMDY)
{
	var d;
	
	// no date input
	if (! (startObj && startObj.value && startObj.value.length > 0)) return;
	
	// calc the startDt
	DateCompletionEx(startObj, bMDY);
	
	if (startObj.value == "") return;

	var sdt = MyParseDateEx(startObj.value, bMDY);

	if (minDt != "") {
		d = MyParseDateEx(minDt, bMDY);
		if (sdt < d) {
			sdt = d;
			startObj.value = FormatDate(sdt, bMDY);
		}
	}
	
	var edt = sdt;
	
	if (interval == "y") {
		edt.setYear(edt.getYear() + diff);
	}
	else if (interval == "m") {
		edt.setMonth(edt.getMonth() + diff);
	}
	else if (interval == "d") {
		edt = DateAdd(edt, diff);
	}

	if (bAdjustOneDay) {
		edt = DateAdd(edt, -1);
	}

	if (maxDt != "") {
		d = MyParseDateEx(maxDt, bMDY);
		
		if (edt > d) {
			edt = d;
		}
	}	
	endObj.value = FormatDate(edt, bMDY);
}

// Only allow input 1234567890/
// <input class=date_edit type=text size=10 max=10 onkeypress="return DateInputCharOnly(event);" onchange="return DateCompletionEx(this, true);" >
function DateInputCharOnly(evt) 
{
//only allow " ", "/", and numbers
	return DateInputCharOnlyEx(evt);
}

//allowedCharSet are in the format of " /0-9\\n\\r"
function DateInputCharOnlyEx(evt, inputAllowedCharSet)
{
	evt = (evt) ? evt : window.event;
	var charCode = (evt.which) ? evt.which : evt.keyCode;
	
	if (!inputAllowedCharSet) 
		inputAllowedCharSet = "";

	var basicAllowedCharSet = "/0-9\-\: ";	//basic char set supports slash and 0-9
	var allowedCharSet = "["+basicAllowedCharSet + inputAllowedCharSet+"]";
	var dateReg = new RegExp(allowedCharSet);

	if ( !IsPrintableChar(charCode) )	//if a function key is pressed
	{
		return true;
	}
	
	if ( String.fromCharCode(charCode).search(dateReg) < 0 )
	{
		status = "This is a date input field and you have entered an invalid character.";
		return false;
	}
	
	status = "";
	return true;
	
	function IsPrintableChar(charCode)
	{
		return (charCode < 127  && charCode > 31 );
	}
	
}

