// ***************************************************************************
// <script language="JavaScript" src="/Includes/Client/FormCheck.js"></script>
// ***************************************************************************
//	External Functions							Internal Functions
// ***************************************************************************
// History: LW    2/5/01	Fix FormatNumber bugs	
//	
// ***************************************************************************

// OK to be empty
var defaultEmptyOK = false

// **************************************************************
function strip(filter,str){
	var i,curChar;
	var retStr = '';
	var len = str.length;
	for(i=0; i<len; i++){
		curChar = str.charAt(i);
		if(filter.indexOf(curChar)<0) //not 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);
}

// **************************************************************
// 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) {
		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: 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;

	// 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.length >= 8) {
				var strYear = src.value.substr(src.value.lastIndexOf('/')+1);
				if (strYear.length >= 4) return false;
			}
	} 
}

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 > 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-2);
			return false;
		}
		else
			return true;
	}
	if (!getInputNumber(':') && event.keyCode != 186 ) return false;

	if ((event.keyCode == 186) && (src.value.indexOf(':') > -1)) return false;	//186-":"

	switch (src.value.length) {
		case 0 :	
			if (event.keyCode == 186)
				src.value = '00:'
			else {
				if (event.keyCode < 51)	
					src.value += String.fromCharCode(event.keyCode);
				else
					src.value += '0' + String.fromCharCode(event.keyCode) + ':';
			}
			return false;
			break;
		case 1 :
			if (event.keyCode == 186)
				src.value = '0' + src.value + ':';
			else {
				if ((src.value=='2') && (event.keyCode > 51)) return false;
				src.value += String.fromCharCode(event.keyCode) + ':';
			}
			return false;
			break;
		case 3 :
			if (event.keyCode < 54) src.value += String.fromCharCode(event.keyCode);
			return false;
			break;
		case 4 :
			src.value += String.fromCharCode(event.keyCode);
			return false;
			break;
	   	default :
			if (src.value.length >= 5) 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() 
{
	var src = event.srcElement;
	if (!Date.parse(src.value) > 0)
		src.value = '';
	else {
		var strNonYear = src.value.substr(0,src.value.lastIndexOf('/')+1);
		var intYear = parseInt(src.value.substr(src.value.lastIndexOf('/')+1));
		if (intYear < 1000) {
			if ((intYear > 70) && (intYear < 100))
				intYear += 1900;
			else
				intYear += 2000;
		}
		if (((strNonYear == '02/29/') || (strNonYear == '2/29/')) && (!isLeapYear(intYear))) 
			src.value = '';
		else
			src.value = 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, hops)
{
	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) {
			if (hops == null) 
				src.form(i+1).focus();
			else
				src.form(i+hops).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 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,numMin,numMax)
{	return !(num < numMin || num > numMax)
}

// **************************************************************   
// 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 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();	
		if (sCaption != '') 
			alert(srcCaption.substr(0,srcCaption.length-1)+' is invalid.');
		else
			alert('This 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();

	if (!isNumeric(src.value,true)) {
		sCaption = sCaption=='' ? 'This ' : 'The '+sCaption;
		alert(sCaption+' field must be numeric. Please reenter it now.');
		src.focus();
		return false;
	}
		
	if (isEmpty(src.value)) return true;
	
	//Validate Range 
	if (s > 0) {	
		var iMin = parseFloat(iFormat.substr(0,s));
		var iMax = parseFloat(iFormat.substr(s+1));
		if (!isRange(src.value,iMin,iMax)) {
			sCaption = sCaption=='' ? 'This ' : 'The '+sCaption;
			alert(sCaption+' field must be in between '+iMin+' and '+iMax+'. Please reenter it now.');
			src.focus();
			return false;
		}
	}
	
	//Format 
	s = iFormat.indexOf(".");
	var iInt = parseInt(iFormat.substr(0,s));
		
	if (Math.abs(src.value) >= Math.pow(10,iInt)) {
		if (src.value < 0)
			alert('The '+sCaption+' must be greater than -'+Math.pow(10,iInt));
		else
			alert('The '+sCaption+' must be less than '+Math.pow(10,iInt));
		src.focus();
	}
	else
		src.value = formatNumber(src.value,iFormat,sStyle);
}

// **************************************************************
function checkRequired()
{
	var src = event.srcElement;
	for(i=0;i<src.length-1;i++) {
		if (src[i].type == 'text' || src[i].type == 'textarea') {
			if (src[i].value == '' && isRequired(src[i].id)) {
				alert('The '+getCaption(src[i].id)+' is the mandatory field.');
				if(!src[i].disabled)
					src[i].focus();
				return false;
			}
		}
	}
}

// **************************************************************
function checkUrl() 
{
	var src = event.srcElement;
}

// **************************************************************
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 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 '';
		}
		else {
			if (src.parentElement.previousSibling == null) return '';
			sCaption = src.parentElement.previousSibling.innerHTML;
		}
			
		sCaption = sCaption.replace("<FONT color=red>* </FONT>","");
		if (sCaption.substr(sCaption.length-1,1) == ':') 
			return sCaption.substr(0,sCaption.length-1);
		else
			return '';
	}
}

// **************************************************************
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 {
			if (src.parentElement.previousSibling == null) return false;
			sCaption = src.parentElement.previousSibling.innerHTML;
		}
		return(sCaption.indexOf("<FONT color=red>* </FONT>") != -1)
	}
}

