// ***************************************************************************
// <script language="JavaScript" src="/Includes/Client/FormCheck.js"></script>
// ***************************************************************************
//	External Functions				Internal Functions
// ***************************************************************************
// History: LW    2/5/01	Fix FormatNumber bugs	
//				LW		6/12/02	Add setNewDateRange function 	
//				LW		8/12/02	Fix getCaption
//				LW 	8/12/02	Enhance checkNumber function
//				LW		11/1/02	Add checkMaxCount for checkbox selection
//				LW		11/5/02	Fix bug in checkNumber for validations without decimal point such as @VN5
//				LW		11/5/02	getCaption return '' if the caption doesn't have : as the ending
//				LW		5/13/03	Add CheckRetypePassword function
//				LW		8/13/03	Add getInputTime function
//				LW		3/06/04	Enable clearIncompleteDate
//				LW		3/06/04  Add checkDate function
// ***************************************************************************

// OK to be empty
var defaultEmptyOK = false;
var previous='';

// **************************************************************
function checkel(which){
	var intended=/INPUT|TEXTAREA|SELECT|OPTION/;
	var excludedtype=/button|submit/;
	if (intended.test(which.tagName)&&!excludedtype.test(which.type))
		return true;
	else
		return false;
}

// **************************************************************
function highlight(highlightcolor){
	eventobj=event.srcElement;
	if (previous!=''){
		if (checkel(previous))
			previous.style.backgroundColor='';
		previous=eventobj;
		if (checkel(eventobj))
			eventobj.style.backgroundColor=highlightcolor;
	}else{
		if (checkel(eventobj))
			eventobj.style.backgroundColor=highlightcolor;
		previous=eventobj;
	}
}

// **************************************************************
function strip(filter,str,within){
	var i,curChar;
	var retStr = '';
	var len = str.length;
	for(i=0; i<len; i++){
		curChar = str.charAt(i);
		if(within == null) {
			if(filter.indexOf(curChar)<0) //not in filter, keep it
				retStr += curChar;
		}
		else {
			if(filter.indexOf(curChar)>-1) //in filter, keep it
				retStr += curChar;
		}
	}
	return retStr;
}

// **************************************************************
function reformat(str){
	var arg;
	var pos = 0;
	var retStr = '';
	var len = reformat.arguments.length;
	for(var i=1; i<len; i++){
		arg = reformat.arguments[i];
		if(i%2==1)
			retStr += arg;
		else{
			retStr += str.substring(pos, pos + arg);
			pos += arg;
		}
	}
	return retStr;
}

// **************************************************************
function getFilteredChar(filterstr)
{
	return (filterstr.indexOf(String.fromCharCode(event.keyCode)) != -1);
}

// **************************************************************
function getPasteFiltered(filterstr) 
{
	var sText = window.clipboardData.getData("Text");
	switch (filterstr.substr(filterstr.length-1,1)) {
	case 'U': 
		if(filterstr.length>1)
			sText = strip(filterstr,sText,1);
		event.srcElement.value = sText.toUpperCase();
		break;
	case 'L': 
		if(filterstr.length>1)
			sText = strip(filterstr,sText,1);
		event.srcElement.value = sText.toLowerCase();
		break;
	default : 
		event.srcElement.value = strip(filterstr,sText,1);
	}
	event.returnValue=false;
}

// **************************************************************
// Example: onKeyPress=""javascript:return getInputNumber('.');""
// **************************************************************
function getInputNumber(strExceptions)
{
	var src = event.srcElement;
	var strNum = '1234567890';
	if (strExceptions != null)
		strNum += strExceptions;
	
	if (src.value.indexOf('.') != -1) strNum = strNum.replace('.','');
	if (src.value.indexOf('-') != -1) strNum = strNum.replace('-','');
	
	return getFilteredChar(strNum);
}

// **************************************************************
function getInputAlpha(strExceptions)
{
	var bln; 
	bln = getFilteredChar("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + strExceptions);
	if (bln) {
		switch (strExceptions.substr(0,1)) {
		case 'U': getUpperCase();
					 break;
		case 'L': getLowerCase();
		}
	}
	return bln;
}

// **************************************************************
function getMaxInput(iMax) {
	var src = event.srcElement;
	return (src.value.length < iMax)
}

// **************************************************************
// Example: onKeyPress=""javascript:return getLowerCase();""
// **************************************************************
function getLowerCase()
{
	event.keyCode = String.fromCharCode(event.keyCode).toLowerCase().charCodeAt(0);
}

// **************************************************************
// Example: onKeyPress=""javascript:return getUpperCase();""
// **************************************************************
function getUpperCase()
{
	event.keyCode = String.fromCharCode(event.keyCode).toUpperCase().charCodeAt(0);
}

// **************************************************************
// Example: onKeyDown=""javascript:return getInputTime();""	Use onKeyDown to get backspace keystroke
// **************************************************************
function getInputTime()
{
	var src = event.srcElement;
	var lastCh = src.value.substr(src.value.length-1,1);

	// Tab
	if (event.keyCode == 9) return true;

	//if ((src.value.length == 5) && (src.createTextRange().text == src.value)) {
	//	src.value = '';
	//}

	// Backspace 
	if (event.keyCode == 8) {
		if (lastCh == ':') {
			src.value = src.value.substr(0,src.value.length-2);
			return false;
		}
		else
			return true;
	}
	if (!getInputNumber(':') && event.keyCode != 58 ) return false;

	if ((event.keyCode == 58) && (src.value.indexOf(':') > -1)) return false;	//58-":"

	switch (src.value.length) {
		case 0 :	
			if (event.keyCode == 58)
				src.value = '00:'
			else {
				if (event.keyCode < 51)	
					src.value += String.fromCharCode(event.keyCode);
				else
					src.value += '0' + String.fromCharCode(event.keyCode) + ':';
			}
			break;
		case 1 :
			if (event.keyCode == 58)
				src.value = '0' + src.value + ':';
			else {
				if ((src.value=='2') && (event.keyCode > 51)) return false;
				src.value += String.fromCharCode(event.keyCode) + ':';
			}
			break;
		case 3 :
			if (event.keyCode < 54) src.value += String.fromCharCode(event.keyCode);
			break;
		case 4 :
			src.value += String.fromCharCode(event.keyCode);
			break;
	   //default :
		//	if (src.value.length >= 5) return false;
	}
	return false;
}

// **************************************************************
// Example: onKeyPress=""javascript:return getInputDate();""
// **************************************************************
function getInputDate()
{
	var src = event.srcElement;
	var lastCh = src.value.substr(src.value.length-1,1);
	var rgMC = new Array(12);
	rgMC[0] = 31;rgMC[1] = 29;rgMC[2] = 31;rgMC[3] = 30;rgMC[4] = 31;rgMC[5] = 30;rgMC[6] = 31;rgMC[7] = 31;rgMC[8] = 30;rgMC[9] = 31;rgMC[10] = 30;rgMC[11] = 31;

	// Tab
	if (event.keyCode == 9)	return true;

	if ((src.value.length > 0) && (document.selection.createRange().text == src.value)) src.value = '';

	// Backspace 
	if (event.keyCode == 8) {
		if (lastCh == '/') {
			src.value = src.value.substr(0,src.value.length-1);
		}
		return true;
	}
	
	if (!getInputNumber('/') && event.keyCode != 191 ) return false;
	if ((event.keyCode == 191) && (lastCh == '/')) return false;

	if (event.keyCode == 47)	// 47-"/"
		if (lastCh != '/' && lastCh != '' && src.value.indexOf('/') == src.value.lastIndexOf('/'))
			return true;
		else
			return false;

		
	switch (src.value.length) {
	   	case 0 :		//First character
			//if (event.keyCode == 48) return false;
			if (event.keyCode > 49) {
				event.srcElement.value += String.fromCharCode(event.keyCode) + '/';
				return false;
			}
			break;
	   	case 1 :		//ie: 1_
			
			if ((src.value=='0') && (event.keyCode == 48 || event.keyCode == 191)) return false;
			if (event.keyCode == 191) {
					src.value += '/';
					return false;
			}
			
			if ((src.value=='1') && (event.keyCode > 50)) return false;
			src.value += String.fromCharCode(event.keyCode) + '/';
			return false;
			break;
		case 2 :		//ie: 2/_
			if (src.value == '2/') {
				if (event.keyCode > 50) {
					event.srcElement.value += String.fromCharCode(event.keyCode) + '/';
					return false;
				}
			}
			else {
				if (event.keyCode > 51) {
					event.srcElement.value += String.fromCharCode(event.keyCode) + '/';
					return false;
				}
			}
			break;
		case 3 :  //ie:10/_   5/1_
			if (lastCh == '/') {
				if (event.keyCode > 51) {
					event.srcElement.value += String.fromCharCode(event.keyCode) + '/';
					return false;
				}
			}
			else {
				var intMonth = parseInt(src.value.substr(0,src.value.indexOf('/')));
				if (parseInt(lastCh + String.fromCharCode(event.keyCode)) > rgMC[intMonth-1]) 
					return false;
				else {
					if (event.keyCode == 191) 
						src.value += '/';
					else
						src.value += String.fromCharCode(event.keyCode) + '/';
					return false;
				}
			}
			break;
		case 4 :  //ie:10/1_   5/5/_
			if (lastCh != '/') {
				var iPos = src.value.indexOf('/');
				var intMonth = parseInt(src.value.substr(0,iPos));
				if (parseInt(src.value.substr(iPos+1) + String.fromCharCode(event.keyCode)) > rgMC[intMonth-1]) 
					return false;
				else {
					if (event.keyCode == 191) 
						src.value += '/';
					else
						src.value += String.fromCharCode(event.keyCode) + '/';
					return false;
				}
			}
			else {
				return true;
			}
			break;
		case 5 :  //ie: 12/31
			if (src.value.indexOf('/') == src.value.lastIndexOf('/'))
				src.value += '/' + String.fromCharCode(event.keyCode);
			else
				src.value += String.fromCharCode(event.keyCode);
			return false;
			break;
	   default :
			if (src.value.lastIndexOf('/') != src.value.indexOf('/')) {
				var strYear = src.value.substr(src.value.lastIndexOf('/')+1);
				if (strYear.length >= 4) return false;
				if (strYear.length >= 2 && strYear.substring(0,2) != "19" && strYear.substring(0,2) != "20") return false;
			}
	} 
}

// **************************************************************
function isLeapYear(intYear) 
{
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) return true;
	}
	else {
		if ((intYear % 4) == 0) return true; 
	}
	return false;
}

// **************************************************************
function clearIncompleteDate(strDate) 
{
	if (strDate == '') return '';
	if (strDate.indexOf('/') == strDate.lastIndexOf('/')) {
		var d = new Date();
		strDate = strDate + '/' + d.getFullYear();
	}	

	if (!Date.parse(strDate) > 0) return strDate

	var strNonYear = strDate.substr(0,strDate.lastIndexOf('/')+1);
	var intYear = parseInt(strDate.substr(strDate.lastIndexOf('/')+1));
	if (intYear < 1000) {
		if ((intYear > 70) && (intYear < 100))
			intYear += 1900;
		else
			intYear += 2000;
	}
	if (((strNonYear == '02/29/') || (strNonYear == '2/29/')) && (!isLeapYear(intYear))) {
		alert('This year is not the leap year.  Please reenter it now');
		return '';
	}
	else
		return strNonYear + intYear.toString(10);
}

// **************************************************************	
function isChecked(fld)
{	
	var src = document.all(fld);
	for(i=0;i<src.length-1;i++) {
		if (src[i].checked == true) 
			return true;
	}
	return false;
}
	
// **************************************************************	
function isFull(intSize)
{
	var src = event.srcElement;
	if (src.value.length > 0 && src.value.length < intSize) {
		src.focus();
		return false;
	}
}

// **************************************************************
function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

// **************************************************************
function jumpNext(intSize)
{
	var src = event.srcElement;
	var filter = [0,8,9,16,17,18,37,38,39,40,46];

	if (src.value.length >= intSize && !containsElement(filter,event.keyCode))	{
		for(i=0;i<src.form.length-1;i++)
			if (src.form(i).id == src.id)	break;
	
		if (i < src.form.length-1) 
			src.form(i+1).focus();
	}
}	

// **************************************************************
function containsElement(arr, ele) {
	var found = false, index = 0;
	while(!found && index < arr.length)
		if(arr[index] == ele)
			found = true;
		else
			index++;
	return found;
}

// **************************************************************
function isTime(str){
	if (isEmpty(str)) 
		if (isTime.arguments.length == 1) return defaultEmptyOK;
      else return (isTime.arguments[1] == true);
	var oMatch = /(24):(00)|([01][0-9]|2[0-3]):([0-5][0-9])/.exec(str);
	if (oMatch)
		return true
	else
		return false;
}

// **************************************************************
function isDate(str){
	if (isEmpty(str)) 
		if (isDate.arguments.length == 1) return defaultEmptyOK;
      else return (isDate.arguments[1] == true);
   var dateVar = new Date(str);
   if(isNaN(dateVar.valueOf()) || (dateVar.valueOf() ==0))
      return false;
   else
      return true;
}

// **************************************************************
function isNumeric(str) {
	if (isEmpty(str)) 
		if (isNumeric.arguments.length == 1) return defaultEmptyOK;
      else return (isNumeric.arguments[1] == true);

	str = strip(' .$,',str);
	//remove leading zeros, if any
	while(str.length > 1 && str.substring(0,1) == '0'){
		str = str.substring(1,str.length);
	}
	var val = parseFloat(str);
	if(isNaN(val))
		return false;
	else
		return true;
}

// **************************************************************   
function isSSN(str) {
	if (isEmpty(str)) 
		if (isSSN.arguments.length == 1) return defaultEmptyOK;
      else return (isSSN.arguments[1] == true);
	str = strip(" -.\n\r\t",str);
	if(isNumeric(str) && str.length == 9) {
		if(str.substr(0,1)!='0')
			return true;
		else
			return false;
	}
	else
		return false;
}

// **************************************************************   
function isPhone(str){
	if (isEmpty(str)) 
		if (isPhone.arguments.length == 1) return defaultEmptyOK;
       else return (isPhone.arguments[1] == true);
	str = strip("*() -./_\n\r\t\\",str);
	if(isNumeric(str) && (str.length == 10 || str.length == 7))
		return true;
	else
		return false;
}

// **************************************************************   
function isZip(str){
	if (isEmpty(str)) 
		if (isZip.arguments.length == 1) return defaultEmptyOK;
      else return (isZip.arguments[1] == true);
	str = strip("- \n\r\t",str);
	if(isNumeric(str)&&(str.length==9 || str.length==5))
		return true;
	else
		return false;
}

// **************************************************************   
function isDigit (c) {
  return ((c >= "0") && (c <= "9"))
}

// **************************************************************   
function isRange(num,sMin,sMax) {	
	var iMin = sMin.indexOf('*') > -1 ? parseFloat(sMin.substr(1)) : parseFloat(sMin);
	var iMax = sMax.indexOf('*') > -1 ? parseFloat(sMax.substr(1)) : parseFloat(sMax);
	var ok1 = (iMin.indexOf('*') > -1) ? eval(num > iMin) : eval(num >= iMin);
	var ok2 = (iFormat.indexOf('*') > -1) ? eval(src.value < iMax) : eval(src.value <= iMax);
	return (ok1 && ok2)
}

// **************************************************************   
// isEmail (STRING str [, BOOLEAN emptyOK])
function isEmail (str)
{   if (isEmpty(str)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
    
    str = strip(" \t\n\r",str);	
    var i = 1;
    var sLength = str.length;
    // look for @
    while ((i < sLength) && (str.charAt(i) != "@"))
    { i++
    }
    if ((i >= sLength) || (str.charAt(i) != "@")) return false;
    else i += 2;
    // look for .
    while ((i < sLength) && (str.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (str.charAt(i) != ".")) return false;
    if (str.indexOf(";") != -1) return false;
    else return true;
}

// **************************************************************   
function formatPhone(str){
	str = strip("*() -./_\n\r\t\\",str);
	if(str.length==0) 
		return "";
	if(str.length==10)
		return reformat(str,"(",3,") ",3,"-",4);
	if(str.length==7)
		return reformat(str,"",3,"-",4);
}

// **************************************************************   
function formatSSN(str){
	str = strip(" -.\n\r\t",str);
	if (str.length == 0)
		return "";
	else
		return reformat(str,"",3,"-",2,"-",4);
}

// **************************************************************   
function formatZip(str){
	str = strip("- \n\r\t",str);
	if(str.length==0)
		return "";
	if(str.length==5)
		return str;
	if(str.length==9)
		return reformat(str,"",5,"-",4);
}

// **************************************************************   
function formatDate(str,style){
	var dateVar = new Date(str);
	var year = dateVar.getYear();
	if(year<10)
		year += 2000;
	if(year<100)
		year += 1900;
	switch(style){
		case "MM/DD/YY":
			return (dateVar.getMonth() + 1) + "/" + dateVar.getDate() + "/" + year;
			break;
		case "DD/MM/YY":
			return dateVar.getDate() + "/" + (dateVar.getMonth() + 1) + "/" + year;
			break;
		case "Month Day, Year":
			return getMonthName(dateVar) + " " + dateVar.getDate() + ", " + year;
			break;
		case "Day, Month Day, Year":
			return getDayName(dateVar) + ", " + getMonthName(dateVar) + " " + dateVar.getDate() + ", " + year;
			break;
		default:
			return (dateVar.getMonth() + 1) + "/" + dateVar.getDate() + "/" + year;
			break;
	}
}

// **************************************************************
function formatNumber(sNumber,sFormat,sStyle)
{
	var bNeg = false;
	
	sNumber = strip(' $,%',sNumber);
	if (sNumber < 0) {
		bNeg = true;
		sNumber *= -1;
	}
	if (sStyle == '%') sNumber = sNumber * 100;
	
	var s = sFormat.indexOf(".");
	var iInt = parseInt(sFormat.substr(0,s));
	var iDec = (s > 0) ? parseInt(sFormat.substr(s+1)) : 0;
	var iVal = Math.round(sNumber * Math.pow(10,iDec));
	if (iVal == 0) return '0';
	var strVal = iVal + '';
	
	var strBDec = strVal.substr(0,strVal.length-iDec);
	if (strBDec=='') strBDec = '0';
	var strADec = strVal.substr(strVal.length-iDec);
	while (strADec.length < iDec) {
		strADec = '0'+strADec;
	}
	var strADec = (iDec>0) ? '.'+strADec : '';

	switch (sStyle) {
   case '$':
   case ',':
      iLen = strBDec.length;
      if (iLen > 3) {
			var strA = "";
			while (iLen > 0) {
				strTemp = strBDec.substring(iLen-3,iLen);
				if (strTemp.length == 3) {
					strA = ","+strTemp+strA;
					iLen -= 3;
				}
				else {
					strA = strTemp+strA;
					iLen=0;
				}
			}
			if (strA.substring(0,1) == ",") strA = strA.substr(1,strA.length-1)
			strBDec = strA;
		}
		strBDec = (sStyle=='$') ? '$'+strBDec : strBDec;
		break;
	case '%' :
		strADec += '%';
		break;
   default :
	if (sStyle != null)
		while (strBDec.length < iInt)
			strBDec = sStyle+strBDec;
   }
   return bNeg ? '-'+strBDec+strADec : strBDec+strADec;
}

// **************************************************************
function checkDate(timeFld, baseDate, msg)
{
	var dInput;
	var fDate, tDate;
	var src = event.srcElement;
	var v = clearIncompleteDate(src.value);

	if (isDate(v, true)) { 
		if (! isEmpty(v)) {
			var tf = document.all(timeFld);
			if (tf != null) {
				if (tf.value == '') {
					src.value = v;
					return;
				}
				dInput = Date.parse(v + ' ' + tf.value);
			}
			else
				dInput = Date.parse(v);

			if (baseDate.indexOf(',') > -1) {
				var arr = baseDate.split(',');
				if (arr[0].length > 0) {
					if (tf != null && tf.value != '')
						fDate = Date.parse(arr[0]);
					else
						fDate = Date.parse(arr[0].substr(0,arr[0].indexOf(' ')))
				}
				if (tf != null && tf.value != '')
					tDate = Date.parse(arr[1]);
				else
					tDate = Date.parse(arr[1].substr(0,arr[1].indexOf(' ')))
			}
			else 
				if (tf != null && tf.value != '')
					fDate = Date.parse(baseDate);
				else
					fDate = Date.parse(baseDate.substr(0,baseDate.indexOf(' ')))

			if (fDate == null && tDate != null) {
					if (dInput > tDate) {
						if (msg == null) {
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be earlier than '+baseDate.replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg);
						src.value = '';
						src.focus();
					}
			}
			else {
				if (fDate != null && tDate == null) {
					if (dInput < fDate) {
						if (msg == null) {
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be later than '+baseDate.replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg);
						src.value = '';
						src.focus();
					}
					else
						src.value = v;
				}
				else {
					if (dInput < fDate || dInput > tDate) {
						if (msg == null) {
							var arr = baseTime.split(',');
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be in between '+arr[0].replace(/#/g,' ')+' and '+arr[1].replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg)
						src.value = '';
						src.focus();
					}
					else
						src.value = v;
				}
			}
		}
	} else {
		var sCaption = getCaption();	
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field is not a valid date input. Please reenter it with the format MM/DD/YYYY now.');
		src.focus();
	}
}

// **************************************************************
function checkTime(dateFld,baseTime,msg) 
	{
	var dInput;
	var fDate, tDate;
	var src = event.srcElement;

	if (isTime(src.value, true)) {
		if (! isEmpty(src.value)) {
			var df = document.all(dateFld);
			if (df == null) df = document.all(dateFld + '_TEXT');
			if (df == null)
				dInput = Date.parse('1/1/2004 ' + src.value);
			else {
				if (df.value == '')
					return
				else
					dInput = Date.parse(df.value + ' ' + src.value)
			}

			if (baseTime.indexOf(',') > -1) {
				var arr = baseTime.split(',');
				if (arr[0].length > 0)
					fDate = arr[0].indexOf('#') > -1 ? Date.parse(arr[0].replace('#',' ')) : Date.parse('1/1/2004 '+arr[0]);
				tDate = arr[1].indexOf('#') > -1 ? Date.parse(arr[1].replace('#',' ')) : Date.parse('1/1/2004 '+arr[1]);
			}
			else 
				fDate = baseTime.indexOf('#') > -1 ? Date.parse(baseTime.replace('#',' ')) : Date.parse('1/1/2004 '+baseTime);
			// Now we have dInput, fDate and tDate
			//alert(fDate + '===' + dInput + '===' + tDate);

			if (fDate == null && tDate != null) {
					if (dInput > tDate) {
						if (msg == null) {
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be earlier than '+baseTime.replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg);
						src.value = '';
						src.focus();
					}
			}
			else {
				if (fDate != null && tDate == null) {
					if (dInput < fDate) {
						if (msg == null) {
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be later than '+baseTime.replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg);
						src.value = '';
						src.focus();
					}
				}
				else {
					if (dInput < fDate || dInput > tDate) {
						if (msg == null) {
							var arr = baseTime.split(',');
							var sCaption = getCaption();	
							sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
							alert(sCaption+' field input must be in between '+arr[0].replace(/#/g,' ')+' and '+arr[1].replace(/#/g,' ')+'. Please reenter it now.');
						}
						else
							alert(msg)
						src.value = '';
						src.focus();
					}
				}
			}
		}
	} else {
		var sCaption = getCaption();	
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field is not a valid time input. Please reenter it now.');
		src.focus();
	}
}

// **************************************************************
function checkPhone()
{
	var src = event.srcElement;
	
	if (isPhone(src.value, true)) 
		src.value = formatPhone(src.value);
	else {
		var sCaption = getCaption();	
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field must be a 7 or 10 digit number (like 555 1212 or 415 555 1212). Please reenter it now.');
		src.focus();
	}
}

// **************************************************************
function checkSSN()
{
	var src = event.srcElement;
	
	if (isSSN(src.value, true)) 
		src.value = formatSSN(src.value);
	else {
		var sCaption = getCaption();	
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field must be a 9 digit number (like 089 32 2003). Please reenter it now.');
		src.focus();
	}
}

// **************************************************************
function checkEmail()
{
	var src = event.srcElement;
	
	if (!isEmail(src.value, true)) {
		var sCaption = getCaption();	
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field must be the email format (like john@abc.com). Please reenter it now.');
		src.focus();
	}
}

// **************************************************************
function checkEmails(sep)
{
	var src = event.srcElement;
	var arrEmails = src.value.split(sep);
	for(i=0;i<arrEmails.length;i++) {
	  if (!isEmail(arrEmails[i], true)) {
		 alert('One of the email addresses is invalid ('+ arrEmails[i]+'). Please reenter it now.');
		 src.focus();
		 break;
	  }
	}
}

// **************************************************************
function checkZip()
{
	var src = event.srcElement;
	
	if (isZip(src.value, true)) 
		src.value = formatZip(src.value);
	else {
		var sCaption = getCaption();
		sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
		alert(sCaption+' field must be a 5 or 9 digit ZIP Code (like 94043 or 94043-1212). Please reenter it now.');
		src.focus();
	}
}

// **************************************************************
function checkNumber(iFormat,sStyle)
{
	var src = event.srcElement;
	var s = iFormat.indexOf(",");
	var sCaption = getCaption();
	sCaption = sCaption=='' ? 'This' : 'The '+sCaption;

	if (!isNumeric(src.value,true)) {
		alert(sCaption+' field must be numeric. Please reenter it now.');
		src.focus();
		return false;
	}
		
	if (isEmpty(src.value)) return true;
	
	//Validate Range ex: 1,  or ,10  or 1,10
	if(s > -1) {
		if (s == 0) {
			var iMax = iFormat.indexOf('*') > -1 ? parseFloat(iFormat.substr(1)) : parseFloat(iFormat);
			var ok = (iFormat.indexOf('*') > -1) ? eval(src.value < iMax) : eval(src.value <= iMax);
			if (!ok) {
				sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
				alert(sCaption+' field must be less'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMax+'. Please reenter it now.');
				src.focus();
				return false;
			}
		}
		else {
			if (s == iFormat.length) {
				var iMin = iFormat.indexOf('*') > -1 ? parseFloat(iFormat.substr(1)) : parseFloat(iFormat);
				var ok = (iFormat.indexOf('*') > -1) ? eval(src.value > iMin) : eval(src.value >= iMin);
				if (!ok) {
					sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
					alert(sCaption+' field must be greater'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMin+'. Please reenter it now.');
					src.focus();
					return false;
				}
			}
			else {
				var sMin = iFormat.substr(0,s);
				var sMax = iFormat.substr(s+1);
				if (!isRange(src.value,sMin,sMax)) {
					sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
					alert(sCaption+' field must be greater'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMin+' and be less'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMax+'. Please reenter it now.');
					src.focus();
					return false;
				}
			}
		}
	}
			
	//Format 
	s = iFormat.indexOf(".");
	if (s == -1)
		var iInt = parseInt(iFormat);
	else
		var iInt = parseInt(iFormat.substr(0,s));
		
	if (Math.abs(src.value) >= Math.pow(10,iInt)) {
		if (src.value < 0)
			alert(sCaption+' field must be greater than -'+Math.pow(10,iInt)+'.');
		else
			alert(sCaption+' field must be less than '+Math.pow(10,iInt)+'.');
		src.focus();
	}
	else
		src.value = formatNumber(src.value,iFormat,sStyle);
}

// **************************************************************
function checkLength(iFormat) {
	var src = event.srcElement;

	if (isEmpty(src.value)) 
		if (checkLength.arguments.length == 1) return defaultEmptyOK;
      else return (checkLength.arguments[1] == true);

	var sCaption = getCaption();
	var s = iFormat.indexOf(",");
	//Validate Range ex: 1,  or ,10  or 1,10
	if (s > -1) {
		if (s == 0) {
			var iMax = iFormat.indexOf('*') > -1 ? parseFloat(iFormat.substr(1)) : parseFloat(iFormat);
			var ok = (iFormat.indexOf('*') > -1) ? eval(src.value.length < iMax) : eval(src.value.length <= iMax);
			if (!ok) {
				sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
				alert(sCaption+' field\'s length must be less'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMax+' characters. Please reenter it now.');
				src.focus();
				return false;
			}
		}
		else {
			if (s == iFormat.length) {
				var iMin = iFormat.indexOf('*') > -1 ? parseFloat(iFormat.substr(1)) : parseFloat(iFormat);
				var ok = (iFormat.indexOf('*') > -1) ? eval(src.value.length > iMin) : eval(src.value.length >= iMin);
				if (!ok) {
					sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
					alert(sCaption+' field\'s length must be greater'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMin+' characters. Please reenter it now.');
					src.focus();
					return false;
				}
			}
			else {
				var sMin = iFormat.substr(0,s);
				var sMax = iFormat.substr(s+1);
				if (!isRange(src.value,sMin,sMax)) {
					sCaption = sCaption=='' ? 'This' : 'The '+sCaption;
					alert(sCaption+' field\'s length must be greater'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMin+' characters and be less'+(iFormat.indexOf('*')==-1 ?' and equal':'')+' than '+iMax+' characters. Please reenter it now.');
					src.focus();
					return false;
				}
			}
		}
	}
}

// **************************************************************
function checkPattern(sPattern) {
	var src = event.srcElement;

	if (isEmpty(src.value)) 
		if (checkPattern.arguments.length == 1) return defaultEmptyOK;
      else return (checkPattern.arguments[1] == true);

	var re = new RegExp(sPattern);	//, "ig");
	var matches = re.exec(src.value);
	if (matches == null || src.value != matches[0]) {
		var sCaption = getCaption();
		alert(sCaption+' must match the pattern ('+sPattern+'). Please reenter it now.');
		src.focus();
		return false;
	}
}

// **************************************************************
function checkRequired()
{
	var src = event.srcElement;
	for(i=0;i<src.form.length-1;i++) {
		if (src.form[i].type == 'text' || src.form[i].type == 'textarea') {
			if (src.form[i].value == '' && isRequired(src.form[i].id)) {
				alert('The '+getCaption(src.form[i].id)+' is the mandatory field.');
				if (!src.form[i].disabled)
					src.form[i].focus();
				return false;
			}
		}
	}
	return true;
}

// **************************************************************
function checkUrl() 
{
	var src = event.srcElement;
	var patternSite = "(?<!href='|>)(?<url>(http|ftp)://[\d\w\.-/%_]+)(?!='>)";
}

// **************************************************************
// The caption must have ":" as the ending
function getCaption(fld) 
{
	if (fld != null) {
		var src = document.all(fld);
		if (src == null) src = event.srcElement;
	}
	else
		var src = event.srcElement;

	if (src != null) {
		var objTD = src;
		do {
			objTD = objTD.parentElement;			
		}
		while (objTD != null && objTD.tagName != 'TD');
		if (objTD == null) return '';

		var sCaption = objTD.innerText;
		if (sCaption.indexOf(':') > -1) {
			sCaption = sCaption.substr(0,sCaption.indexOf(':'));
		}
		else {
			if (objTD.previousSibling == null) return '';
			if (objTD.previousSibling.innerHTML.indexOf('</') > -1) {			
				sCaption = objTD.previousSibling.lastChild.nodeValue;
			}
			else
				sCaption = objTD.previousSibling.innerHTML;
		}
		if (sCaption == null) return '';
		sCaption = sCaption.toUpperCase();
		sCaption = sCaption.replace("<FONT COLOR=RED>*</FONT>","");
		sCaption=sCaption.replace(/\s+$/,"");		//Trim
		if (sCaption.substr(sCaption.length-1,1) == ':') 
			sCaption = sCaption.substr(0,sCaption.length-1)
		else
			sCaption = '';
		return sCaption;
	}
}

// **************************************************************
function isRequired(fld) {

	if (fld != null) {
		var src = document.all(fld);
		if (src == null) src = event.srcElement;
	}
	else
		var src = event.srcElement;
	if (src != null) {
		var sCaption = src.parentElement.innerText;
		if (sCaption.substr(sCaption.length-1,1) == ':') {
			var parentHTML = src.parentElement.innerHTML;
			if (parentHTML.indexOf(src.id) < parentHTML.indexOf(sCaption))
				var sCaption = src.parentElement.previousSibling.innerHTML;
			else
				if (parentHTML.indexOf(sCaption) < 0) return false;
		}
		else {
			var objTD = src.parentElement;
			if (objTD.tagName != 'TD') {
				objTD = src.parentElement.parentElement;
				if (objTD.tagName != 'TD') 
					return false;
			}
			if (objTD.previousSibling == null) return false;
			sCaption = objTD.previousSibling.innerHTML;
		}
		sCaption = sCaption.toUpperCase();
		return((sCaption.indexOf("<FONT COLOR=RED>*</FONT>") != -1) || (sCaption.indexOf("<FONT COLOR=RED>"+unescape('%u2022')+"</FONT>") != -1));
	}
}

// **************************************************************
function setNewDateRange(str,sUniqueID)
{
	var src = event.srcElement;
	if (str == 'From') {
		var srcToText = getSubControl(src.id,sUniqueID+'__ctl',1);
		var srcToImg = srcToText.nextSibling;
		if (src.value != '') {
			var cc = srcToImg.getAttribute('onclick').toString();
			var iBgn = cc.indexOf(",'")+2;
			var iEnd = cc.indexOf("')");
			srcToImg.onclick = function() {ShowCalendar(src.value,cc.substr(iBgn,iEnd-iBgn))};
		}

	}
	else {
		var srcToText = getSubControl(src.id,sUniqueID+'__ctl',-1);
		var srcToImg = srcToText.nextSibling;
		if (src.value != '') {
			var cc = srcToImg.getAttribute('onclick').toString();
			var iBgn = cc.indexOf("('")+2;
			var iEnd = cc.indexOf("','");
			srcToImg.onclick = function() {ShowCalendar(cc.substr(iBgn,iEnd-iBgn),src.value)};
		}
	}
	
}

// **************************************************************
function getSubControl(srcId,sTag,iMove) {
	for(j=sTag.length+1;j<=srcId.length;j++) {
		var val = parseInt(srcId.substr(j,1));
		if (isNaN(val)) break;
	}
	var iCnt = parseInt(srcId.substr(sTag.length,j-sTag.length));
	iCnt += iMove;
	return document.all(sTag + iCnt + srcId.substring(j));
}

// **************************************************************
function isSameControl(sUniqueID) {
	if (document.activeElement == null)
		return false;
	else {
		return (document.activeElement.id.substr(0,sUniqueID.length) == sUniqueID);
	}
}

// **************************************************************
function checkRange(str,sUniqueID)
{

	var src = event.srcElement;
	if (src.nextSibling == null || src.nextSibling.tagName != 'IMG')
		cType = 'N';
	else
		cType = 'D';

	if (str == 'From') {
		var srcTo = getSubControl(src.id,sUniqueID+'__ctl',1);
		if (srcTo == null) return;
		if (cType == 'D') {
			if (Date.parse(src.value) > Date.parse(srcTo.value)) {
				alert('TO date must be later than FROM date. Please reenter it now.');
				src.focus();
			}
		}
		else
			if (parseFloat(src.value) > parseFloat(srcTo.value)) {
				alert('TO number must be greater than FROM number. Please reenter it now.');
				src.focus();
			}
	}
	else {
		var srcFrom = getSubControl(src.id,sUniqueID+'__ctl',-1);
		if (srcFrom == null) return;
		if (cType == 'D') {
			if (Date.parse(srcFrom.value) > Date.parse(src.value)) {
				alert('TO date must be later than FROM date. Please reenter it now.');
				src.focus();
			}
		}
		else
			if (parseFloat(srcFrom.value) > parseFloat(src.value)) {
				alert('TO number must be greater than FROM number. Please reenter it now.');
				src.focus();
			}

	}
}

// **************************************************************
function checkMaxCount(groupId,max) {
	var src = event.srcElement;
	var i = 0; 
	var total = 0;
	var detail;

	while(true) 
	{
		detail = document.all(groupId + i);
		if (detail == null) {
			break;
		}
		if (detail.checked == true)
			total += 1;
		i++;
	}
	if (total > max) {
		alert('you are allowed to select at most ' + max + ' options.');
		src.checked = false;
	}
}

// **************************************************************
function checkRetype(id) {
	var refld = event.srcElement;
	var fld = document.all(id);
	if (fld != null) {
		if (fld.value != refld.value) {
			alert('The password and retype password are not the same. Please reenter it now.');
			fld.focus();
		}
	}
}

// **************************************************************
function AllowTabCharacter() {   
	if (event != null) {      
		if (event.srcElement) {         
			if (event.keyCode == 9) {  // tab character               
				if (document.selection != null) {                  
					document.selection.createRange().text = '\t';                  
					event.returnValue = false;               
				}               
				else {                  
					event.srcElement.value += '\t';                  
					return false;               
				}
			} 

		}
	}
	return true;
}

// **************************************************************
function mask(strMask) {
	var src = event.srcElement;
	var validMaskChars = '9Aa';
	var bValid;

	// Find the first position of underscore
	var iCurrent = src.value.indexOf('_');
	
	var iKeyCode = event.keyCode;
	
	// Special keys
	switch (iKeyCode) {
		case 9:		//Tab
			return true;
			break;
		case 8:		//Backspace
			var i = (iCurrent == -1) ? src.value.length-1 : iCurrent-1;
			while (i > -1) {
				if (validMaskChars.indexOf(strMask.charAt(i)) > -1) break;
				i--;
			}
			if (i>-1) src.value = src.value.substr(0,i) + '_' + src.value.substr(i+1);
			setMaskPos();
			return false;
	}

	// ignore input if no underscore are found
	if (iCurrent == -1) return false

	curChar = strMask.charAt(iCurrent);
	switch (curChar) {
		case '9':	//Numeric
			bValid = getInputNumber();
			break;
		case 'A':	//Uppercase
			bValid = getInputAlpha('U');
			break;
		case 'a':	//Lowercase
			bValid = getInputAlpha('L');
	}

	// Accept valid Input and append non-mask characters
	if (bValid) {
		src.value = src.value.substr(0,iCurrent) + String.fromCharCode(iKeyCode) + src.value.substr(iCurrent+1);	//Append valid input 
		setMaskPos();
	}
	return false;
}

// **************************************************************
function setMaskPos() {
	var src = event.srcElement;
	var tr = src.createTextRange();
	var iCurrent = src.value.indexOf('_');
	if (iCurrent > -1)
		tr.move('character',iCurrent);
	else
		tr.move('character',src.value.length);
	tr.select();
}

// **************************************************************
function checkMask() {
}