/*TypeValidator.js

  Used by the TypeValidator server control to perform client side validation.
  
  Revision History:
     06/01/03 JLC - Created
     12/08/03 JLC - Fixed validation error when year is entered with more than 
					four digits (ex: 01/01/19465 was considered valid)
	 12/11/03 JLC - If the user keyed a leading '0' on dtInteger or dtMoney types,
					the parseInt() function interpreted the numbers as Octal.  Added
					radix parameter of 10 to all parseInt() calls.
	 01/14/04 JLC - Added minimum year check (year cannot be less than 1800) to prevent
					"valid" dates from blowing up SQL Server which has a minium year of 1753.
					
*/
function stripNonNumeric(x) {
	return x.replace(/\D/g, '');
}
function isLeapYear(intYear) {
	if ( (intYear % 100) == 0) {
		if ( (intYear % 400) == 0) { return true; }
	} else {
		if ( (intYear % 4) == 0) { return true; }
	}
	return false;
}
function formatDate(InVal) {
	var intMonth=0;
	var intDay=0;
	var intYear=0;
	var intCentury=0;
	var strPartsArray;
	var strVal;
	
	//Remove whitespace characters
	strVal = InVal.replace(/\s/g,"");
	
	//convert any remaining non-numeric values to "/"
	strVal = strVal.replace(/\D/g,"/");
	
	//Parse Month, Day, Year from input string
	if (strVal.indexOf('/')!=-1) {
		strPartsArray = strVal.split("/");
		if (strPartsArray.length==3) {
			intMonth = Number(strPartsArray[0]); 
			intDay = Number(strPartsArray[1]); 
			intYear = Number(strPartsArray[2]);
		}
	} else {
		intMonth = parseInt(strVal.substr(0,2),10);
		intDay = parseInt(strVal.substr(2,2),10);
		if (strVal.length == 6) { 
			intYear = parseInt(strVal.substr(4,2),10);
		}
		if (strVal.length == 8) {
			intYear = parseInt(strVal.substr(4,4),10);
		}
	}

	//Map NaNs to zero
	if (isNaN(intMonth)) intMonth=0;
	if (isNaN(intDay)) intDay=0;
	if (isNaN(intYear)) intYear=0;

	//check year to make sure it is <= 2100
	if (intYear>2100) { intYear = 0; }

	//alert ('Month=' + intMonth + ' Day=' + intDay + ' Year=' + intYear);

	//Make sure all values were parsed from the input
	if (intMonth==0 || intDay==0 || intYear==0) {
		return "";
	}
	//Fix Century
	if (intYear<100) {
		var dateToday = new Date();
		var intCurrentYear = dateToday.getFullYear();
		var intCentury = Math.floor(intCurrentYear / 100) * 100;
		var intYear = intCentury + intYear;
		// Use 20 as the pivot date 
		// (anything more than twenty years in the future will use the previous century)
		if (Math.abs(intYear - intCurrentYear) > 20){
			intYear = intYear - 100;
		}
	} else {
		//Any year less than 1800 is invalid
		if (intYear<1800) {
			return "";
		}
	}

	//Check Month number	
	if (intMonth<1 || intMonth>12) {
		return "";
	}
	//Check Day of month
	if (intDay<1) {
		return "";
	}
	// Check max day, include leap year calc
	var arrDays = new Array(31,0,31,30,31,30,31,31,30,31,30,31);
	if (intMonth==2) {
		if (isLeapYear(intYear)) {
			if (intDay>29) return "";
		} else {
			if (intDay>28) return "";	
		}
	} else {
		if (intDay > arrDays[intMonth-1]) {
			return "";
		}
	}
	//Format the return
	return intMonth + "/" + intDay + "/" + intYear;
}

function TypeValidate(val) {

	//UhOh, there is a problem, source should not be null... whattodo? 
	//Avoid JS error by bailing out of JS validation and let server take care of it.
	if (val==null) {
		//alert("val is null!!!");
		return true;
	}
	
	var ctrl = document.all[val.controltovalidate];
    var ctrl_val = ValidatorGetValue(val.controltovalidate);
    ctrl_val = trimAll(ctrl_val);

	var dataType = val.datatype;
	var Msg = '';

	if (val.required=='') {
		if (ctrl_val=='') {
			Msg = val.dispname + " is required.";
			val.errormessage = Msg;
			if (val.showtext=='') {
				val.innerText = Msg;	
			}
			return false;
		}
	} else {
		if (ctrl_val=='') return true;
	}
	
    if ( (typeof(ctrl) != "undefined") && (Msg=='') ) {
    
		switch (dataType) {
		case 'dtString':
			break
			
		case 'dtInteger':
			// check the data type first
			ctrl_val = removeCommas(ctrl_val);
			if (!validateInteger(ctrl_val)){
				Msg=val.dispname + " must be a valid integer."
			}else{
				// check against the minimum value
				if (val.min!=""){
					if (parseInt(ctrl_val,10) < parseInt(val.min,10)){
						Msg=val.dispname + " must be >= " + addCommas(val.min) + ".";
					}
				}
				// Check against the maximum value
				if (val.max!=""){
					if (parseInt(ctrl_val,10) > parseInt(val.max,10)){
						Msg=val.dispname + " must be <= " + addCommas(val.max) + ".";
					}
				}
				// Format string with commas
				if (Msg=="") {
					if (val.nocomma==undefined) {
						ctrl.value = addCommas(parseInt(ctrl_val,10).toString());
					}
				}
			}
			break
			
		case 'dtMoney':
			ctrl_val = removeCurrency(ctrl_val);
			if (!validateCurrency(ctrl_val)){ 
				Msg=val.dispname + " must be a valid currency value.";
			}else{
				// check against the minimum value
				if (val.min!=""){
					if (parseFloat(ctrl_val) < parseFloat(val.min)){
						Msg=val.dispname + " must be >= $" + addCommas(val.min) + ".";
					}
				}
				// Check against the maximum value
				if (val.max!=""){
					if (parseFloat(ctrl_val) > parseFloat(val.max)){
						Msg=val.dispname + " must be <= $" + addCommas(val.max) + ".";
					}
				}
				if (Msg=="") {
					//format the value because it is valid
					if (val.nocomma==undefined) {
						if (val.allowcents==undefined) {
							ctrl.value=addCommas(parseInt(ctrl_val,10).toString());
						} else {
							ctrl.value=formatCurrency(parseFloat(ctrl_val), false);
						}
					}
				}
			}
			break
			
		case 'dtPercent':
			ctrl_val = ctrl_val.replace("%", "");
			if (!validateNumeric(ctrl_val)) {
				Msg=val.dispname + " must be a valid percentage value."
			} else {
				if (val.min!=""){
					if (parseFloat(ctrl_val) < parseFloat(val.min)){
						Msg=val.dispname + " must be >= " + val.min + "%.";
					}
				}
				if (val.max!=""){
					if (parseFloat(ctrl_val) > parseFloat(val.max)){
						Msg=val.dispname + " must be <= " + val.max + "%.";
					}
				}
			}
			break
			
		case 'dtFloat':
			ctrl_val = removeCommas(ctrl_val);
			if (!validateNumeric(ctrl_val)){
				Msg=val.dispname + " must be a valid number."
			}else{
				if (val.min!=""){
					if (parseFloat(ctrl_val) < parseFloat(val.min)){
						Msg=val.dispname + " must be >= " + val.min + ".";
					}
				}
				if (val.max!=""){
					if (parseFloat(ctrl_val) > parseFloat(val.max)){
						Msg=val.dispname + " must be <= " + val.max + ".";
					}
				}
			}
			break
			
		case 'dtDate':
			var ourDate;
			var compareDate;
			
			ctrl_val = formatDate(ctrl_val);
			if (ctrl_val==""){
				Msg=val.dispname + " must be a valid date in the form mm/dd/yyyy or mmddyyyy.";
			}else{
				ctrl.value = ctrl_val;
				// comparisons must be based on a date datatype not strings
				// for minimum and maixmum tests to be accurate
				ourDate = new Date(ctrl_val);
				if (val.min!=""){
					compareDate = new Date(val.min);
					if (ourDate < compareDate){
						Msg=val.dispname + " must be >= " + val.min + ".";
					}
				}
				if (val.max!=""){
					compareDate = new Date(val.max);
					if (ourDate > compareDate){
						Msg=val.dispname + " must be <= " + val.max + ".";
					}
				}
			}	
			break
			
		case 'dtPhone':
			ctrl_val = stripNonNumeric(ctrl_val);
			if (ctrl_val.length!=10) {
				Msg=val.dispname + " must be a valid phone number with area code.";
			} else {
				ctrl.value = "(" + ctrl_val.substr(0,3) + ") " + ctrl_val.substr(3,3) + "-" + ctrl_val.substr(6,4);
			}
			break
			
		case 'dtZip':
			if (!validateUSZip(ctrl_val)){
				Msg=val.dispname + " must be a valid US Zip code.";
			}
			break
			
		case 'dtSSN':
			ctrl_val = stripNonNumeric(ctrl_val);
			if (ctrl_val.length!=9){
				Msg=val.dispname + " must be a valid 9-digit Social Security Number.";
			} else {
				ctrl.value = ctrl_val.substr(0,3) + "-" + ctrl_val.substr(3,2) + "-" + ctrl_val.substr(5,4);
			}
			break
			
		case 'dtLatLong':
			if (!validateNumeric(ctrl_val)){
				Msg=val.dispname + " must be a valid number."
			}else{
				if (val.min!=""){
					if (parseFloat(ctrl_val) < parseFloat(val.min)){
						Msg=val.dispname + " must be >= " + val.min + ".";
					}
				}
				if (val.max!=""){
					if (parseFloat(ctrl_val) > parseFloat(val.max)){
						Msg=val.dispname + " must be <= " + val.max + ".";
					}
				}
			}
			break
			
		case 'dtTaxID':
			if (!validateTaxID(ctrl_val)){
				Msg=val.dispname + " must be a valid TaxID in the form 12-3456789 or 123-45-6789";
			}
			break
			
		case 'dtEMail':
			if (!validateEmail(ctrl_val)){
				Msg=val.dispname + " must be a valid e-mail address.";
			}
			break
			
		case 'dtTime':
			if (!validateTime(ctrl_val)) {
				Msg=val.dispname + " must be a valid time.";
			}
			break
			
		default:
			break
		}
    }

   	if (Msg!='') {
		val.errormessage = Msg;
		if (val.showtext=='') {
			val.innerText = Msg;
		}
		return false;
	} else {
		return true;
	}
}

