// Form Validation
// Lawrence & Schiller
// June 2004

function validateForm(formObj) {
	var fieldName, fieldValue, ii, character, year, month, day, delimiter, dateArray, reNumber;
	var MONTH_STRINGS = {january:1, jan:1, february:2, feb:2, march:3, mar:3, april:4, apr:4, may:5, june:6, jun:6, july:7, jul:7, august:8, aug:8, september:9, sep:9, october:10, oct:10, november:11, nov:11, december:12, dec:12}
	var errorMsg = '';
	for(var i = 0; i < formObj.elements.length; i++) {
		if(formObj.elements[i].type == 'hidden') {
			if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 9), 9) == '_required') {
				// ::DONE:: _required - Makes sure that a field is not left empty
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 9);
				fieldValue = getFieldValue(formObj[fieldName]);
				if((fieldValue == null) || (fieldValue == '') || (isBlank(fieldValue)) ) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 8), 8) == '_integer') {
				// ::DONE:: _integer - Checks whether the value of the field is a number (NO decimal points allowed)
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 8);
				fieldValue = getFieldValue(formObj[fieldName]);
				reNumber = /(^-?\d\d*$)/;
				if(!reNumber.test(fieldValue)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 7), 7) == '_usdate') {
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 7);
				fieldValue = getFieldValue(formObj[fieldName]);				
  				reUSDate = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
			    //check to see if in correct format
  				if(!reUSDate.test(fieldValue)) {
    				returnval = 0;
				}	
  				else {
					returnval = 0;
    				strSeparator = fieldValue.substring(2,3) //find date separator
    				arrayDate = fieldValue.split(strSeparator); //split date into month, day, year
    				//create a lookup for months not equal to Feb.
    				arrayLookup = {'01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
            		            		'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    				intDay = parseInt(arrayDate[1]);

    				//check if month value and day value agree
    				if(arrayLookup[arrayDate[0]] != null) {
      					if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        					returnval = 1; //found in lookup table, good date
    				}

    				//check for February
    				intYear = parseInt(arrayDate[2]);
    				intMonth = parseInt(arrayDate[0]);
    				if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
      					returnval = 1; //Feb. had valid number of days
  				}
				if(returnval == 0) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';  //any other values, bad date
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 9), 9) == '_eurodate') {
				// ::DONE:: _eurodate - Validates dates as above, but in European format; for instance, 27/11/00 or 27 Novemeber 2000
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 9);
				fieldValue = getFieldValue(formObj[fieldName]);
				delimiter = getDateDelimiter(fieldValue);
				dateArray = fieldValue.split(delimiter);
				day = dateArray[0];
				month = dateArray[1];
				year = dateArray[2];
				if(delimiter == ' ') {
					month = MONTH_STRINGS[month];
				}
				if(!isDate(year, month, day)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 6), 6) == '_float') {
				// ::DONE:: _float - Checks whether the value of the field is a number (decimal points allowed)
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 6);
				fieldValue = getFieldValue(formObj[fieldName]);
				reNumber = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
				if(!reNumber.test(fieldValue)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 6), 6) == '_email') {
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 6);
				fieldValue = getFieldValue(formObj[fieldName]);
				reEmail = /(^[a-z0-9]([a-z0-9_\.]*)@([a-z0-9_\-\.]*)([.][a-z0-9]{3})$)|(^[a-z]([a-z0-9_\.]*)@([a-z0-9_\.]*)(\.[a-z0-9]{3})(\.[a-z0-9]{2})*$)/i;
				if(!reEmail.test(fieldValue)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 5), 5) == '_date') {
				// ::NOT DONE::  _date - Makes suer the field contains a date in the most common formate; for instance 11/27/00 or Novembmer 27, 2000
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 5);
				fieldValue = getFieldValue(formObj[fieldName]);
				delimiter = getDateDelimiter(fieldValue);
				dateArray = fieldValue.split(delimiter);
				month = dateArray[0];
				day = dateArray[1];
				year = dateArray[2];
				if(delimiter == ' ') {
					month = MONTH_STRINGS[month.toLowerCase()];
					// ::BUG:: If there is no day value then a JS error is thrown
					day = day.substring(0, day.indexOf(',')); // Removes the trailing coma ','
				}
				if(!isDate(year, month, day)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 6), 6) == '_range') {
				// ::NOT DONE:: _range - Ensures that the value is within a munimum and maximum
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 6);
				fieldValue = getFieldValue(formObj[fieldName]);
				errorMsg += 'The "range" validation is not yet in operation.' + '\n';
			}
			else if(formObj.elements[i].name.substr((formObj.elements[i].name.length - 5), 5) == '_time') {
				// ::NOT DONE:: _time - Validates time in the most common time formats
				fieldName = formObj.elements[i].name.substr(0, formObj.elements[i].name.length - 5);
				fieldValue = getFieldValue(formObj[fieldName]);
//				reNumber = /^\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM]?)?$/;
				reNumber = /^\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM])?/;
//				reNumber = /[^(\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM]))((\d{1,2}[:]\d{2}([:]\d{2})?)]/;
//				reNumber = /[^(\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM]))(\d{1,2}[:]\d{2}([:]\d{2})?)]/;
				// ::BUG:: Dosen't correctly validate the values of the hour, month, second, or daypart
				if(fieldValue == '' || !reNumber.test(fieldValue)) {
					onFieldError(formObj[fieldName]);
					errorMsg += formObj.elements[i].value + '\n';
				}
			}
		}
	}
	
	errorMsg += customValidation(formObj);
	
	if(errorMsg != '') {
		alert(errorMsg);
		return false;
	}
	return true;
}

function customValidation() {
	return '';
}

function onFieldError(fieldObj) {
	fieldObj.style.backgroundColor = '#B60008';
	fieldObj.style.color = '#FFFFFF';
	fieldObj.focus();
}

function getFieldValue(fieldObj) {
	if(fieldObj) {
		switch(fieldObj.type) {
			case 'text':
			case 'textarea':
			case 'hidden':
			case 'fileupload':
			case 'password':
				return fieldObj.value;
			case 'select-one':
				return fieldObj.options[fieldObj.selectedIndex].value;
			case 'select-multiple':
				// ::TODO:: Loop through selected items and build a comma-delimited list
				alert('The "required" validation is not yet in operation for multiple selects.');
				return '';
			case 'radio':
				alert('The "required" validation is not yet in operation for radio buttons.');
				return '';
			case 'checkbox':
				// ::TODO:: Loop through selected items and build a comma-delimited list
				alert('The "required" validation is not yet in operation for check boxes.');
				return '';
		}
	}else {
		return '';
	}
}

function getDateDelimiter(dateStr) {
	if(dateStr.indexOf('/') >= 0) {
		return '/';
	}else if(dateStr.indexOf('-') >= 0) {
		return '-';
	}else {
		return ' ';
	}
}

function isDate(year, month, day) {
	var yearInt = parseInt(year);
	var monthInt = parseInt(month);
	var dayInt = parseInt(day);
	var reNumber = /(^-?\d\d*$)/;
	if(!reNumber.test(yearInt) || !reNumber.test(monthInt) || !reNumber.test(dayInt)) {
		return false;
	}
	if((yearInt <= 0 || (yearInt.toString().length != 2 && yearInt.toString().length != 4)) || (monthInt < 1 || monthInt > 12) || (dayInt < 1 || dayInt > 31)) {
		return false;
	}
	var daysInMonth = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	if((yearInt % 4 == 0) && ((yearInt % 100 != 0) || (yearInt % 400 == 0))) {
		daysInMonth[2] = 29;
	}
	if(dayInt > daysInMonth[monthInt]) {
		return false;
	}
	return true;
}

function isBlank(s) {
	var flag = 0;
	for(var i=0; i<s.length; i++) {
		var c = s.charAt(i);
		if(c == ' ') flag = flag + 1;
		if(c == '\n') flag = flag + 2;
	}
	if(flag == s.length)
		return true;
	else
		return false;
}
