//version 1 by Michael Martineau

var IS_NETSCAPE = (navigator.appName == "Netscape" ? true : false);
		
var globalValidationArray = new Array();
var globalDateValidationArray = new Array();

function isBlank(testValue) {
	var blankPattern = /^\s*$/
	return blankPattern.test(testValue)
}


function isDate(testValue) {
	var datePattern0 = /^(\d{1,2})\/(\d{1,2})\/(\d{2})$/;
	if(datePattern0.test(testValue)) {
		result = testValue.match(datePattern0);
		testValue = result[1] + '/' + result[2] + '/';
		if(result[3] < 50) {
			testValue += '20' + result[3];
		} else {
			testValue += '19' + result[3];
		}
	}
	//alert(testValue)
	
	//acceptable format: mm/dd/yyyy, mmddyyyy, m/d/yyyy
	var datePattern1 = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
	var datePattern2 = /^(\d{2})(\d{2})(\d{4})$/;
	var result;
	if(datePattern1.test(testValue)) {
//		alert("pattern1");
		result = testValue.match(datePattern1);
	} else if (datePattern2.test(testValue)) {
//		alert("pattern2");
		result = testValue.match(datePattern2);	
	} else {
		return false
	}
	//alert(result[1]);
	currMonth=parseInt(result[1]*1)
	currDay=parseInt(result[2]*1)
	currYear=parseInt(result[3]*1)
	maxDays=parseInt(maxDaysInMonth(currMonth))
	if(!isLeapYear(currYear)&&maxDays==29) maxDays=28
	//alert("Month:"+currMonth+" -- Day:"+currDay+" -- Year:"+currYear+"  --- maxDays:"+maxDays);
	if(currMonth >= 1 && currMonth <= 12 && currDay >= 1 && currDay <= maxDays) {
		return true
	} else {
		return false
	}
}
function isZip(testValue) {
	var zipPattern = /^(\d{5}(-\d{4})?|\d{9})$/
	return zipPattern.test(testValue)
}
function isSSN(testValue) {
	var ssnPattern = /^(\d{3}-\d{2}-\d{4}|\d{9})$/
	return ssnPattern.test(testValue)
}

function isEmail(testValue) {
	var emailPattern = /^([\w-]+\.)*[\w-]+@[\w-]+\.[\w-]+(\.[\w-]+)*$/
	return emailPattern.test(testValue)
}

function isPosInteger(testValue) {
	var posIntegerPattern = /^\d+$/
	return posIntegerPattern.test(testValue)
}

function isCurrency(testValue) {
	var currencyPattern = /^-?\$?(\d{1,3}(((,\d{3})*)|(\d*))(\.\d{2})?|\.\d{2})$/
	return currencyPattern.test(testValue)
}

function isNumber(testValue) {
	var numberPattern = /^-?(\d{1,3}(((,\d{3})*)|(\d*))(\.\d+)?|\.\d+)$/
	return numberPattern.test(testValue)
}

function isNumberAbsolute(testValue) {
	var numberPattern = /^-?(\d+(\.\d+)?|\.\d+)$/
	return numberPattern.test(testValue)
}

function isPhone(testValue) {
	var phonePattern = /^(\(\d{3}\)\d{3}-\d{4}|\d{3}-\d{3}-\d{4}|\d{10}|\d{3}\.\d{3}\.\d{4})$/
	return phonePattern.test(testValue)
}

function isPhoneShort(testValue) {
	var phonePattern = /^(\d{3}-\d{4}|\d{3}-\d{4}|\d{7}|\d{3}\.\d{4})$/
	return phonePattern.test(testValue)
}

function isNumberMaxDecimals(testValue,maxDecimals,isFixed) {
	var numDigits,numberPattern
	if(isFixed) {
		numDigits=maxDecimals
		eval("numberPattern = /^-?(\\d{1,3}(((,\\d{3})*)|(\\d*))(\\.\\d{"+numDigits+"})|\\.\\d{"+numDigits+"})$/")		
	}
	else {
		numDigits="0,"+maxDecimals
		eval("numberPattern = /^-?(\\d{1,3}(((,\\d{3})*)|(\\d*))(\\.\\d{"+numDigits+"})?|\\.\\d{"+numDigits+"})$/")
	}
	return numberPattern.test(testValue)
}

function strip(stripText,regX) {
	var strippedText=""
	stripText = stripText + ""
	eval("strippedText=stripText.replace("+regX+",'')")
	return strippedText
}

function stripPosInteger(stripValue) {
	var strippedNumber
	strippedNumber=strip(stripValue,"/[^0-9]/g")
	return (strippedNumber!="" ? strippedNumber * 1 : "")
}

function stripNumber(stripValue) {
	var strippedNumber,numArray,negPos
	strippedNumber=strip(stripValue,"/[^-\.0-9]*/g")
	if(strippedNumber.indexOf(".")==strippedNumber.length-1) {
		strippedNumber=strippedNumber.substring(0,strippedNumber.length-1)
	}
	if(strippedNumber.indexOf("-")==strippedNumber.length-1) {
		strippedNumber=strippedNumber.substring(0,strippedNumber.length-1)
	}
	if(strippedNumber!="") {
		negPos=strippedNumber.indexOf("-",0)
		strippedNumber=strip(strippedNumber,"/-/g")
		if(negPos==0) {
			strippedNumber="-"+strippedNumber
		}
		numArray=strippedNumber.split(".")
		if(numArray.length>1) {
			for(var i=0;i<numArray.length;i++) {
				if(i!=0){
					strippedNumber+=numArray[i]
				}
				else {
					strippedNumber=numArray[i]+"."
				}
			}
		}
		return (strippedNumber * 1)
	}
	else return 0
}

function packValidation(fieldName,fieldType,caption,isRequired,minChars,maxChars,options) {
	var testType=fieldType.toUpperCase()
	if(isBlank(fieldName)) {
		alert("DEVELOPMENT WARNING!: FieldName cannot be blank!")
	}
	if(testType!="RATE"&&testType!="INTERESTRATE"&&testType!="TEXT"&&testType!="PHONE"&&testType!="SSN"&&testType!="ZIP"&&testType!="DATE"&&testType!="EMAIL"&&testType!="NUMBER"&&testType!="POSINTEGER"&&testType!="CURRENCY"&&testType!="PASSWORD") {
		alert("DEVELOPMENT WARNING!: Invalid validation fieldType passed! ("+fieldName+")")
	}
	if(isBlank(isRequired)||(isRequired!=true&&isRequired!=false)) {
		alert("DEVELOPMENT WARNING!: isRequired must be true or false! ("+fieldName+")")
	}
	if(isBlank(caption)) {
		alert("DEVELOPMENT WARNING!: Caption cannot be blank! ("+fieldName+")")
	}		
	if(isBlank(minChars)||!isPosInteger(minChars)||isBlank(maxChars)||!isPosInteger(maxChars)) {
		alert("DEVELOPMENT WARNING!: minChars and maxChars must be positive integers! ("+fieldName+")")
	}		
	if(isRequired&&minChars==0) {
		alert("DEVELOPMENT WARNING!: Invalid minChars. Must be greater than 0 when isRequired is set to true! ("+fieldName+")")
	}
	if(minChars>maxChars) {
		alert("DEVELOPMENT WARNING!: Invalid minChars. Must be less than maxChars! ("+fieldName+")")
	}
	globalValidationArray[globalValidationArray.length] = fieldName+"¿"+fieldType.toLowerCase()+"¿"+caption+"¿"+isRequired+"¿"+minChars+"¿"+maxChars+"¿"+options.toLowerCase()
}

function packDateValidation(monthObjName,dayObjName,yearObjName,caption,isRequired,options) {
	if(isBlank(monthObjName)) {
		alert("DEVELOPMENT WARNING!: monthObjName cannot be blank! ("+caption+")")
	}
	if(isBlank(dayObjName)) {
		alert("DEVELOPMENT WARNING!: dayObjName cannot be blank! ("+caption+")")
	}
	if(isBlank(yearObjName)) {
		alert("DEVELOPMENT WARNING!: yearObjName cannot be blank! ("+caption+")")
	}			
	if(isBlank(caption)) {
		alert("DEVELOPMENT WARNING!: Caption cannot be blank! ("+caption+")")
	}	
	if(isBlank(isRequired)||(isRequired!=true&&isRequired!=false)) {
		alert("DEVELOPMENT WARNING!: isRequired must be true or false! ("+caption+")")
	}
	globalDateValidationArray[globalDateValidationArray.length] = monthObjName+"¿"+dayObjName+"¿"+yearObjName+"¿"+caption+"¿"+isRequired+"¿"+options.toLowerCase()
}


function unpackOptions(options,keyName) {
	keyName=keyName.toLowerCase()
	var optionArray=options.split("|")
	for(var i=0;i<optionArray.length;i++) {
		if(optionArray[i].indexOf(keyName)!=-1) {
			var pair=optionArray[i].split(":")
			if(!isNumberAbsolute(pair[1])) {
				alert("WARNING!: Invalid option passed: " + pair[1] )
			}
			else return pair[1]
		}
	}
	return ""
}

function comparePasswords(formObj,password1,password2,passwordCaption1,passwordCaption2) {
	var pass1,pass2
	eval("pass1=formObj."+password1)
	eval("pass2=formObj."+password2)
	if(pass1.value!=pass2.value) {
		pass1.value=""
		pass2.value=""
		return passwordCaption1+" does not match "+passwordCaption2+". Please re-type both passwords.\n"
	}
	return ""
}


function validateDates(formObj) {
	var dateValidationArray = globalDateValidationArray;
	var message="",tempArray,monthObjName,dayObjName,yearObjName,caption,isRequired,options
	var monthValue,dayValue,yearValue,dayObj,numDays,monthObj
	
	for(var i=0;i<dateValidationArray.length;i++) {
		tempArray=dateValidationArray[i].split("¿")
		monthObjName=tempArray[0]
		dayObjName=tempArray[1]
		yearObjName=tempArray[2]
		caption=tempArray[3]
		isRequired=tempArray[4]
		options=tempArray[5]
		
		//eval("monthValue=formObj."+monthObjName+".options[formObj."+monthObjName+".selectedIndex].value")
		eval("monthObj=formObj."+monthObjName)
		eval("dayObj=formObj."+dayObjName)
		if(dayObj.type.indexOf("select")!=-1) {
			dayValue=dayObj.options[dayObj.selectedIndex].value
		}
		else {
			dayValue=dayObj.value
		}
		if(monthObj.type.indexOf("select")!=-1) {
			monthValue=monthObj.options[monthObj.selectedIndex].value
		}
		else {
			monthValue=monthObj.value
		}
		eval("yearValue=formObj."+yearObjName+".value")
		
		if(isRequired=="true"&&(isBlank(monthValue)||isBlank(dayValue)||isBlank(yearValue))) {
			message=message+caption+" is required.\n"
		}
		else if(isRequired=="false"&&isBlank(monthValue)&&isBlank(dayValue)&&isBlank(yearValue)) {
			//let it pass
		}		
		else if(!isPosInteger(monthValue)||!isPosInteger(dayValue)||!isPosInteger(yearValue)) {
			message=message+caption+" is invalid.\n"
		}
		else if(isPosInteger(monthValue)&&isPosInteger(dayValue)&&isPosInteger(yearValue)){
			if(!isLeapYear(yearValue)&&monthValue==2&&dayValue==29) {
				message=message+caption+" is invalid.  February "+yearValue+" does not have 29 days.\n"
			}
			numDays=maxDaysInMonth(monthValue)
			if(numDays==0||dayValue<1||dayValue>numDays) {
				message=message+caption+" is invalid.\n"
			}
			if(yearValue>999) {
				minValue=unpackOptions(options,"min")
				maxValue=unpackOptions(options,"max")
				if(minValue!="") {
					if(yearValue<(minValue*1)) message=message+caption+" year must be at least "+minValue+"\n"
				}
				if(maxValue!="") {
					if(yearValue>(maxValue*1)) message=message+caption+" year cannot be more than "+maxValue+"\n"
				}
			}
			else {
				message=message+caption+" must have a 4 digit year.\n"
			}
		}		
	}
	globalDateValidationArray.length=0;
	if(!isBlank(message)) return message
	else return ""
}


function validateForm(formObj) {
	var validationArray = globalValidationArray;
	var tempArray,fieldObj,fieldName,caption,fieldType,isRequired,minChars,maxChars,options,message=""
	var fieldValue,minValue,maxValue,tempNum,decimalsValue,fixedValue, focusObject
	focusObject = "";
	for(var i=0;i<validationArray.length;i++) {
		minValue=""
		maxValue=""
		decimalsValue=""
		fixedValue=""
		tempArray=validationArray[i].split("¿")
		fieldName=tempArray[0]
		fieldType=tempArray[1]
		caption=tempArray[2]
		isRequired=tempArray[3]
		minChars=tempArray[4]
		maxChars=tempArray[5]
		options=tempArray[6]

		eval("fieldObj=formObj."+fieldName)
		if(fieldObj.type.indexOf("select")!=-1) {
			fieldValue=fieldObj.options[fieldObj.selectedIndex].text
		}
		else {
			fieldValue=fieldObj.value
		}
		
		if(isRequired=="true"&&isBlank(fieldValue)) {
			message=message+caption+" is a required field.\n"
			if(focusObject=="") {focusObject=fieldObj}
		}
		else if(!isBlank(fieldValue)){
			if(fieldType=="zip") {
				if(!isZip(fieldValue)) {
					message=message+caption+" is invalid. Use format: 12345-6789\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
			}		
			if(fieldType=="date") {
				if(!isDate(fieldValue)) {
					message=message+caption+" is invalid. Use format: MM/DD/YYYY\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
			}			
			if(fieldType=="email") {
				if(!isEmail(fieldValue)) {
					message=message+caption+" is an invalid email address.\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
			}
			if(fieldType=="ssn") {
				if(!isSSN(fieldValue)) {
					message=message+caption+" is invalid. Use format: 123-45-6789\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
			}				
			if(fieldType=="posinteger") {
				if(!isPosInteger(fieldValue)) {
					message=message+caption+" is invalid.\n"
					if(focusObject=="") {focusObject=fieldObj}
				} else {
					minValue=unpackOptions(options,"min")
					maxValue=unpackOptions(options,"max")
					tempNum=stripPosInteger(fieldValue)*1
					if(minValue!="") {
						if(tempNum<(minValue*1)) {
							message=message+caption+" must be at least "+minValue+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
					if(maxValue!="") {
						if(tempNum>(maxValue*1)) {
							message=message+caption+" cannot be more than "+maxValue+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
				}				
			}
			if(fieldType=="currency") {
				if(!isCurrency(fieldValue)) {
					message=message+caption+" is invalid.\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
				else {
					minValue=unpackOptions(options,"min")
					maxValue=unpackOptions(options,"max")
					tempNum=stripNumber(fieldValue)*1
					if(minValue!="") {
						if(tempNum<(minValue*1)) {
							message=message+caption+" must be at least "+formatCurrency(minValue)+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
					if(maxValue!="") {
						if(tempNum>(maxValue*1)) {
							message=message+caption+" cannot be more than "+formatCurrency(maxValue)+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
				}
			}	
			if(fieldType=="number") {
				if(!isNumber(fieldValue)) {
					message=message+caption+" is an invalid number.\n"
					if(focusObject=="") {focusObject=fieldObj}
				}
				else {
					minValue=unpackOptions(options,"min")
					maxValue=unpackOptions(options,"max")
					fixedValue=unpackOptions(options,"fixed")
					decimalsValue=unpackOptions(options,"decimals")
					tempNum=stripNumber(fieldValue)*1
					if(minValue!="") {
						if(tempNum<(minValue*1)) {
							message=message+caption+" must be at least "+minValue+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
					if(maxValue!="") {
						if(tempNum>(maxValue*1)) {
							message=message+caption+" cannot be more than "+maxValue+"\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
					if(decimalsValue!="") {
						if(!isNumberMaxDecimals(tempNum,decimalsValue,false)) {
							message=message+caption+" cannot have more than "+decimalsValue+" digits after the decimal.\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}
					if(fixedValue!="") {
						if(!isNumberMaxDecimals(tempNum,fixedValue,true)) {
							message=message+caption+" must have "+fixedValue+" digits after the decimal.\n"
							if(focusObject=="") {focusObject=fieldObj}
						}
					}					
				}
			}				
			if(fieldValue.length<minChars) {
				message=message+caption+" must have at least "+minChars+" characters.\n"
				if(focusObject=="") {focusObject=fieldObj}
			} else if(fieldValue.length>maxChars) {
				message=message+caption+" cannot have more than "+maxChars+" characters.\n"
				if(focusObject=="") {focusObject=fieldObj}
			}
		}
	}
	globalValidationArray.length=0;
	if(isBlank(message)) {
		return "";
	} else {
		focusObject.focus();
		return message;
	}
}

function validateFormAlert(formObj) {
	var message = validateForm(formObj);
	if(isBlank(message)) {
		return true
	} else {
		alertErrorMessage(message)
		return false
	}
}

function alertErrorMessage(message) {
		
	var header
   	header  = "______________________________________________________\n\n"
    header += "Your request cannot continue because of the following errors.\n";
    header += "Please correct these errors and submit again.\n";
    header += "______________________________________________________\n\n"
	alert(header+message)
}

function formatDate(strDate) {
	var tempDate=strDate
	var result;
	if(isDate(tempDate)) {
		var datePattern1 = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
		var datePattern2 = /^(\d{2})(\d{2})(\d{4})$/;
		if(datePattern1.test(tempDate)) {
			result = tempDate.match(datePattern1);
		} else if (datePattern2.test(tempDate)) {
			result = tempDate.match(datePattern2);	
		}
		return result[1]+"/"+result[2]+"/"+result[3];
	}
	else return ""
}

function formatPhone(strPhone) {
	var tempPhone=strPhone
	if(isPhone(tempPhone)) {
		tempPhone=strip(tempPhone, "/[^0-9]/g")
		tempPhone=tempPhone + ""
		return tempPhone.substring(0,3)+"-"+tempPhone.substring(3,6)+"-"+tempPhone.substring(6,10)
	} else if(isPhoneShort(tempPhone)) {
		tempPhone=strip(tempPhone, "/[^0-9]/g")
		tempPhone=tempPhone + ""
		return tempPhone.substring(0,3)+"-"+tempPhone.substring(3,7);
	} else {
		return strPhone;
	}
}

function formatCurrency(mycurrency) {
	var mycurr
	var addneg=false
	mycurr=stripNumber(mycurrency)
	mycurr=(Math.round(mycurr*100))/100
	mycurr=mycurr + ""
	mycurrlen=mycurr.length
	
	negpos=mycurr.indexOf("-",0)
	if(negpos==0) {
		mycurr=mycurr.substring(1,mycurrlen)
		addneg=true
	}
	mycurr="$"+mycurr
	mycurrlen=mycurr.length
	periodpos=mycurr.indexOf(".",0)
	if(periodpos==mycurrlen-2 && periodpos!=-1) {
		mycurr+="0"
	}
	else if(periodpos==-1) {
		mycurr+=".00"
	}
	//put commas in
	periodpos=mycurr.indexOf(".",0)
	mycurrlen=mycurr.length
	for(i=periodpos-4;i>0;i-=4) {
		if(mycurr.charAt(i)!="$"){
			newcurr=mycurr.substring(0,i+1)+","+mycurr.substring(i+1,mycurrlen)
			mycurr=newcurr
			mycurrlen+=1
			periodpos+=1
			i+=1
		}
	}
	if(addneg==true) mycurr="-"+mycurr
	return mycurr
}

function changeDate(changeToDate,monthObj,dayObj,yearObj) {
	var tempDate
	tempDate = new Date(changeToDate)
	if(monthObj.options.length==12) offset=0
	else offset=1
	
	monthObj.selectedIndex=(tempDate.getMonth()+offset)
	adjustDays(monthObj,dayObj)
	dayObj.selectedIndex=tempDate.getDate()
	yearObj.value=tempDate.getFullYear()
}


function insertToday(dateObj) {
	var tempDate
	tempDate = new Date()
	dateObj.value=tempDate.getMonth()+1+"/"+tempDate.getDate()+"/"+tempDate.getFullYear();
}


function maxDaysInMonth(currMonth) {
	if(currMonth==2) return 29
	else if(currMonth==1||currMonth==3||currMonth==5||currMonth==7||currMonth==8||currMonth==10||currMonth==12) return 31
	else if(currMonth==4||currMonth==6||currMonth==9||currMonth==11) return 30
	else return 0
}


function isLeapYear(year) {
	return ((!(year%4) && (year%100)) || !(year%400))
}
