/** ULTRA-SIMPLE EVENT ADDING **/

function addEventSimple(obj,evt,fn) {
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}

function removeEventSimple(obj,evt,fn) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,false);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}

var validationErrorMessage = new Object();
validationErrorMessage['required'] = 'This field is required';
validationErrorMessage['numeric'] = 'This field requires a number';
validationErrorMessage['pattern'] = 'Pattern incorrect';
validationErrorMessage['email'] = 'Incorrect email address';

var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["pattern"] = isPattern;
validationFunctions["numeric"] = isNumeric;
validationFunctions["email"] = isEmail;

function isRequired(formField) {
 switch (formField.type) {
 case 'text':
 case 'textarea':
 case 'select-one':
 if (formField.value && (formField.value != validationErrorMessage['required']))
 return true;
 return false;
 case 'radio':
 var radios = formField.form[formField.name];
 for (var i=0;i<radios.length;i++) {
 if (radios[i].checked) return true;
 }
 return false;
 case 'checkbox':
 return formField.checked;
 }
}

function isPattern(formField,pattern) {
 var regExp = new RegExp("^"+pattern+"$","");
 var correct = regExp.test(formField.value);
 return correct;
}

function isNumeric(formField) {
 return isPattern(formField,"((\\d)|(\(\)\-\.))+");
}

function isEmail(formField) {
 return isPattern(formField,"([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+")
}

function emptyFunction() {
 return true;
}

/*********************************/

var W3CDOM = document.createElement && document.getElementsByTagName;

function validateForms() {
 if (!W3CDOM) return;
 var forms = document.forms;
 for (var i=0;i<forms.length;i++) {
 forms[i].onsubmit = validate;
 }
}

addEventSimple(window,'load',validateForms);

function validate() {
 var els = this.elements;
 var validForm = true;
 var firstError = null;
 for (var i=0;i<els.length;i++) {
 if (els[i].removeError)
 els[i].removeError();
 var req = els[i].className;
 if (!req) continue;
 var reqs = req.split(' ');
 for (var j=0;j<reqs.length;j++) {
 if (!validationFunctions[reqs[j]])
 validationFunctions[reqs[j]] = emptyFunction;
 var OK = validationFunctions[reqs[j]](els[i]);
 if (OK != true) {
 var errorMessage = OK || validationErrorMessage[reqs[j]];
 writeError(els[i],errorMessage)
 validForm = false;
 if (!firstError)
 firstError = els[i];
 break;
 }
 }
 }

 if (!validForm) {
 alert("Errors have been found");
 location.hash = '#';
 }
 return validForm;

}

function writeError(obj,message) {
 obj.className += ' errorMessage';
 obj.onfocus = removeError;
 if (obj.errorMessage || obj.parentNode.errorMessage) return;
 var errorMessage = document.createElement('label');
 errorMessage.className = 'errorMessage';
 errorMessage.setAttribute('for',obj.id);
 errorMessage.setAttribute('htmlFor',obj.id);
 errorMessage.appendChild(document.createTextNode(message));
 obj.value = message;
 // obj.style.color = "#FF1F1F";
 obj.errorMessage = errorMessage;
}

function removeError() {
 this.className = this.className.replace(/errorMessage/,'');
 if (this.errorMessage) {
 this.value = "";
 // this.style.color = "#000";
 this.errorMessage = null;
 }
 this.onchange = null;
}
