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);
}

function isEmail(value) {
	var emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i;		
	return emailRegExp.test(value);		 
}

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"];
	var dteDate;
	dteDate=new Date(year,month,day);
	return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
}

function isPhone(value) {
	var objRegExp  =  /^[0-9()\ -]+$/;
	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 = "";
	for(var field in rules) {
		var f = form.elements[field];
		if(!f) f = el(formPrefix + field);
		if(!f) continue;		
		
		var fieldValue = f.value;
		
		
		if(f.style.display=="none") 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;
						valid = isRequired(fieldValue);
					break;
			}
			if(!valid) {
				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;
				break;
			}
		}
	}
	if(_FORM_ERROR) {
		switch(alertType) {
			case 'all' :
				el(formPrefix + 'formContainerError').innerHTML = errorMessages;
				el(formPrefix + 'TR_formTableError').style.display = "" ;
			break;
			default:
				alert(errorMessages);
			break;
		}
		if(focusField && form.elements[focusField]) {
			form.elements[focusField].focus();
		}
		return false;
	}
	return true;
}
