/*
 Author 		: Chairat Panpun
 Date			: 7/12/00
 Description 	: This module consists of a collection of functions concerning to
	Date & Time validation.
 Module 		: Date & Time Functions
 Supervisor 	: Mark Able 
 Version 		: 1.0  
 Compatability	: IE 4.0+/Netscape 4.0+ 
*/

/*
 isDate2(dd, mm, yyyy) determines whether the datevalue in format "d-m-y", "m-d-y" or "y-m-d" can be 
 converted to a valid date value.
*/

function isDate2(dataType, inpVal){
	var theDate = inpVal;
	var notAllowStr = ' /-+';
	var dateArr;
	var formation;
	var toDate;
	var dateStr;
	var dateIdent;
	var str;

	// finding formation that programmer defined
	var tmp = dataType;
	var tmpArr = tmp.split(":");
	formation = tmpArr[1];
	
	// calling the dateBreaker() function to break down user's input into array
	dateArr = dateBreaker(theDate);

	// checking to find the illegal date format from the returned date array
	if((dateArr == -1) || (dateArr.length != 3) || (dateArr[0]=='') || (dateArr[dateArr.length-1]==''))
		return false;
	// calling the formatting() function by the formation specified, a string of date is send back
	switch(formation){
		case 'd-m-y' :	dateStr = formatting(dateArr[1], dateArr[1], dateArr[0], dateArr[2]);
						dateIdent = dateArr[0];
						break;
		case 'm-d-y' :	dateStr = formatting(dateArr[0], dateArr[0], dateArr[1], dateArr[2]);
						dateIdent = dateArr[1];
						break;
		case 'y-m-d' :	dateStr = formatting(dateArr[1], dateArr[1], dateArr[2], dateArr[0]);
						dateIdent = dateArr[2];
						break;
		default		 :	alert('Please check if the defined date format allowed.');
						return false;
	}
	var dateObj = Date.parse(dateStr);
	if(dateObj.toString() == "NaN"){
		return false;
	}
	else
		toDate = new Date(dateStr);
	// scaning through the elements in the array for not allowed strings
	for(j=0; j<dateArr.length; j++){
		for(k=0; k<dateArr[j].length; k++){
			subArray = dateArr[j].substring(k, k+1);
			if(notAllowStr.indexOf(subArray) != -1)
				return false;
		}
	}
	str = toDate.toString();
	
	dateGen = str.split(' ');
	// comparing generated date to the one by the user to find the correct day per month
	if(eval(dateGen[2]) != eval(dateIdent))
		return false;
	inpVal = inpVal.toLowerCase();
	
	// if everything is corrected, return true to the textChk()
	return true;
}

function dateBreaker(dateIn){
	var dateArr;
	var separator = ' /-';
	var subSep;
	var isSeparator = false;

	// Searching for the standard separators
	for(j=0; j<separator.length; j++){
		subSep = separator.substring(j, j+1);
		if(dateIn.indexOf(subSep) != -1){
			dateArr = dateIn.split(subSep);
			isSeparator = true;
			break;
		}
		else
			isSeparator = false;
	}
	// If the standard separators are not found
	if(!isSeparator)
		return -1;
	// The standard separators are found and the date string is returned
	return dateArr;
}


// Checks if strTime is in HH:MM:SS AM/PM format. The seconds and AM/PM are optional.
function isTime(strTime) {
	var strValid = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	var arrstrMatch = strTime.match(strValid);

	if (arrstrMatch == null) return false;	// Time is not in a valid format.	
	strHour = arrstrMatch[1];
	strMinute = arrstrMatch[2];
	strSecond = arrstrMatch[4];
	strAmPm = arrstrMatch[6];
	if (strSecond == "") strSecond = null; 
	if (strAmPm == "") strAmPm = null;

	// strHour must be between 1 and 12. (or 0 and 23 for military time)
	if (strHour < 0 || strHour > 23) return false;
	if (strHour <= 12 && strAmPm == null) {
		if (confirm("OK = Standard Time (AM/PM), CANCEL = Military Time")) return false;
	}

	// You can't specify AM or PM for military time.
	if  (strHour > 12 && strAmPm != null) return false;

	// strMinute must be between 0 and 59.
	if (strMinute < 0 || strMinute > 59) return false;

	// strSecond must be between 0 and 59.
	if (strSecond != null && (strSecond < 0 || strSecond > 59)) return false;
	return true;
}

// Checks if strTime is in HH:MM:SS format (military format). 
function isTime2(inpVal){
	var TimeAdd = inpVal;
	var Exp = /[:0-9]/;
	var result;
	var Chr;
	var j;
	var ZeroVal;
	
	ZeroVal = true;
	result = true;
	ChkCol = 0;
	for(var i=0; i<TimeAdd.length; i++){
		j = i+1;
		Chr = TimeAdd.substring(i,j)
		if ((Chr!="0")&&(Chr!=".")) 
			ZeroVal = false;
		if (Chr==":")
			ChkCol = ChkCol+1;	
		if (Exp.test(Chr)==false) result = false;
	}
	if (ZeroVal==true) result = false;
	if (ChkCol==0) {
		HourSpend = parseInt(TimeAdd);
		if ((HourSpend<0)||(HourSpend>23)) result = false;
	}
	if (ChkCol==1) {
		PosC = TimeAdd.indexOf(':')
		StrHour = TimeAdd.substring(0,PosC);
		PosC2 = PosC+1;
		StrMN = TimeAdd.substring(PosC2,TimeAdd.length);
		HourSpend = parseInt(StrHour);
		MNSpend = parseInt(StrMN);
		if ((HourSpend<0)||(HourSpend>23)) result = false;
		if ((MNSpend<0)||(MNSpend>59)) result = false;
	}
	if (ChkCol>1)  result = false;
	return result;
}


/*
 isDate(dd, mm, yyyy) determines whether the "dd,mm,yyyy" can be 
 converted to a valid date value.
*/
function isDate(mm, dd, yyyy) {
	var intMM, intDD, intYYYY;
	var intLeap;
	var blnValid = true;
	intMM = parseInt(mm);
	intDD = parseInt(dd);	
	intYYYY = parseInt(yyyy);	
	intLeap = parseInt(intYYYY / 4);
	if (intDD > 31) {
		blnValid = false;
	}
	else {
		if (intMM > 12){
			blnValid = false;
		}
		else{
			if ((intMM == 0) || (intDD  == 0) || (intYYYY == 0)){
				blnValid = false;
			}
			else{
				if ((intMM == 4) || (intMM == 6) || (intMM == 9) || (intMM == 11)) {
					if ((intDD == 31) || (intDD == 0)) blnValid = false;
				}
				if (intMM == 2) {	// February, leap year				
					if (isNaN(intLeap)) blnValid = false;
					if (intDD > 29) blnValid = false;
					if (intDD == 29 && ((intYYYY / 4) != parseInt(intYYYY / 4))) blnValid = false;
				}
			}
		}
	}
	if (blnValid) {
		return true;
	} else {
		return false;
	}
}

// DateDif(dt1, dt2) returns a number representing the day between two date (dt2 - dt1).
function DateDif(dt1, dt2) {
	var dtm1, dtm2, dtmTmp, dtmDif, dtmDay;
	var dtmTmDif;
	
	dtm1 = new Date();	
	dtmTmp = new Date(dt1);
	dtm1.setTime(dtmTmp.getTime());
	dtm2 = new Date();
	dtmTmp = new Date(dt2);
	dtm2.setTime(dtmTmp.getTime());
	dtmDif = new Date();
	dtmDif.setTime(dtm2.getTime() - dtm1.getTime());
	dtmTmDif = dtmDif.getTime();
	dtmDay = Math.floor(dtmTmDif / (1000 * 60 * 60 * 24));
	return dtmDay;	
}

// Checks if strTime is in HH:MM:SS AM/PM format. The seconds and AM/PM are optional.
function isTime(strTime) {
	var strValid = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	var arrstrMatch = strTime.match(strValid);

	if (arrstrMatch == null) return false;	// Time is not in a valid format.	
	strHour = arrstrMatch[1];
	strMinute = arrstrMatch[2];
	strSecond = arrstrMatch[4];
	strAmPm = arrstrMatch[6];
	if (strSecond == "") strSecond = null; 
	if (strAmPm == "") strAmPm = null;

	// strHour must be between 1 and 12. (or 0 and 23 for military time)
	if (strHour < 0 || strHour > 23) return false;
	if (strHour <= 12 && strAmPm == null) {
		if (confirm("OK = Standard Time (AM/PM), CANCEL = Military Time")) return false;
	}

	// You can't specify AM or PM for military time.
	if  (strHour > 12 && strAmPm != null) return false;

	// strMinute must be between 0 and 59.
	if (strMinute < 0 || strMinute > 59) return false;

	// strSecond must be between 0 and 59.
	if (strSecond != null && (strSecond < 0 || strSecond > 59)) return false;
	return true;
}

function dateBreaker(dateIn){
	var dateArr;
	var separator = ' /-';
	var subSep;
	var isSeparator = false;

	// Searching for the standard separators
	for(j=0; j<separator.length; j++){
		subSep = separator.substring(j, j+1);
		if(dateIn.indexOf(subSep) != -1){
			dateArr = dateIn.split(subSep);
			isSeparator = true;
			break;
		}
		else
			isSeparator = false;
	}
	// If the standard separators are not found
	if(!isSeparator)
		return -1;
	// The standard separators are found and the date string is returned
	return dateArr;
}

function formatting(month, elem1, elem2, elem3){
	var dateStr = ' ';
	
	if(elem3.length!=4)
		return dateStr;
	// checking for the month by name
	if(isNaN(month)){
		if(month.length < 3)
			return dateStr;
		dateStr = elem1+' '+elem2+' '+elem3;
	}
	else{
		if((month>12) || (month<1) || (month.length > 2) || (elem3.length != 4))
			return dateStr;
		
		dateStr = elem1+'/'+elem2+'/'+elem3;
	}
	return dateStr;
}