var _FORM_ERROR = false;

function isNumeric(value) {
	var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
	return objRegExp.test(value);		
}

function isInteger(value){
	if (isNumeric(value)){
		return (value.search(/^-?[0-9]+$/) == 0);
	}
	return false;
}

function isFloat(value) {
	return isNumeric(value);
}

/*
 * added the "+" character to be valid in an email address
 * gbh 072310
 */
function isEmail(value) {	
	var emailRegExp = /^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i;
	var ret = emailRegExp.test(value);
	return ret;
}

function isZipCode(value) {
	var objRegExp  =  /^\d{5}([\-]\d{4})?$/;
	return objRegExp.test(value);
}

function isDate(value) {
	var dateComponents = getDateComponents(value);
	var year = dateComponents["year"];
	var month = dateComponents["month"] - 1;
	var day = dateComponents["day"];
	if(year.length == 2) {
		if(year > 80) year = "19" + year;
		else year = "20" + year;
	}
	var dteDate;
	dteDate=new Date(year,month,day);
	return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
}

function isPhone(value) {
	/* this should check for 10 digits and then any other characters, if they are there*/
	var objRegExp  =  /^.*[0-9]{3}.*[0-9]{3}.*[0-9]{4}.*$/;		
	return objRegExp.test(value);
}

function isRequired(value) {
	if (value==null || value=="" ) return false;
	return true;
}

function fieldValidator(field, validationCond, message) {
	if(_FORM_ERROR) return ;
	if(!validationCond) {
		_FORM_ERROR = true;
		if(message) alert(message);
		field.focus();
	}
}

function validateForm(form, rules, formPrefix, alertType) {
	_FORM_ERROR = false;
	var focusField = "";
	if(typeof(formPrefix) == "undefined") formPrefix = "";
	var valid = true;
	var errorMessages = "";
	var lastErrorMessage;
	for(var field in rules) {
		/*
		if(field.substring(field.length - 7) == "_jseval") {
			
		}
		*/
		var f = form.elements[field];
		if(!f) f = $(formPrefix + field);
		if(!f) {
			 f = form.elements[field + "[]"];
			 if(f) f = f[0];
			 if(!f) continue;		
		}
		var fieldValue = f.value;
		if(typeof(f.style) == "undefined") continue;
		if(f.style.display=="none") continue;
		if(f.disabled) continue;
		if(typeof(rules[field]["required"]) == 'undefined' && !isRequired(fieldValue)) continue;
		for(var validationRule in rules[field]) {			
			valid = true;
			switch(validationRule) {
				case 'int':	
						valid = isInteger(fieldValue);
					break;
				case 'float':
						valid = isFloat(fieldValue);
					break;
				case 'email':
						valid = isEmail(fieldValue);
					break;
				case 'phone':
						valid = isPhone(fieldValue);
					break;
				case 'zip':
						valid = isZipCode(fieldValue);
					break;
				case 'date':
						valid = isDate(fieldValue);
					break;
				case 'required':						
						if(f.type=='select-multiple')
							fieldValue = f.options.length;
						if(f.type == 'checkbox') {
							if(!f.checked) fieldValue = "";
						}
											
						valid = isRequired(fieldValue);
					break;
			}
			if(!valid) {
				if(lastErrorMessage == rules[field][validationRule]["message"]) break;

				switch(alertType) {
					case "all" :
							_FORM_ERROR = true;
							errorMessages = errorMessages + rules[field][validationRule]["message"] + "<br />";
						break;
					case "last" :
							_FORM_ERROR = true;
							errorMessages = rules[field][validationRule]["message"];
						break;
					default: //first
							fieldValidator(f, valid, rules[field][validationRule]["message"]);
							return false;
						break;
				}
				if(!focusField || alertType=="last") focusField = field;
				lastErrorMessage = rules[field][validationRule]["message"];

				break;
			}
		}
	}
	
	if(_FORM_ERROR) {
		switch(alertType) {
			case 'all' :
				$(formPrefix + 'formContainerError').innerHTML = '<div class="formMessageError">' + errorMessages + '</div>';
				$(formPrefix + 'TR_formTableError').style.display = "" ;
                                self.scrollTo(0,0);
				
			break;
			default:
				alert(errorMessages);
			break;
		}
		if(focusField && form.elements[focusField]) {
			form.elements[focusField].focus();
		}
		return false;
	}
	return true;
}