if (window.Element) {
	Element.prototype.selectNodes = function (sXPath) {
	    var evaluator = new XPathEvaluator();
	    var result = evaluator.evaluate(sXPath, this, null,XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);    
		var nodes = new Array;
	    if (result != null) {
	        var el = result.iterateNext();
	        while(el) {
	            nodes.push(el);
	            el = result.iterateNext();
	        }
	    }
		return nodes;
	};
}

var PREFIX="validation:";

window.onload=function() {
	for (i=0;i<document.forms.length;i++) {
		var frm=document.forms[i];	
		for (j=0;j<frm.elements.length;j++) {
			fld=frm[j];
			if ((fld.className!=null) && fld.className.match("^"+PREFIX)) {
				var span=document.createElement("span");
				span.id=PREFIX+fld.name;
				span.className="validation";
				span.innerHTML="!";
				span.style.visibility="hidden";
				fld.parentNode.insertBefore(span, fld.nextSibling);
			}
		}
	}
}

function validate(frm) {
	var message="";
	var validatedFields=new Array();
	for (i=0;i<frm.elements.length;i++) {
		var fld=frm[i];
		if ((fld.className!=null) && fld.className.match("^"+PREFIX)) {
			var classes=fld.className.replace(PREFIX,"").split("_");
			validatedFields[fld.name]="";
			for (j in classes) {
				switch (classes[j]) {
					case "required" :	validatedFields[fld.name]+=(isValidRequired(frm[fld.name])?"":"required");
										break;
					case "phone" 	:	validatedFields[fld.name]+=(isValidPhone(frm[fld.name])?"":"invalid");
										break;
					case "email" 	:	validatedFields[fld.name]+=(isValidEmail(frm[fld.name])?"":"invalid");
										break;
				}
			}
		}
	}
	var validForm=true;
	for(name in validatedFields)	{
		var validField=(validatedFields[name]=="");
		validForm=validForm && validField;
		indicator(name,!validField);
		if (!validField) {
 			message+=name+" is "+validatedFields[name]+"\n";
		}
	}
	if (!validForm) {
		alert("Please correct the following problems:\n"+message);
	} else {
		frm["src"].value=document.location.href;
	}
	return validForm;
}

function indicator(fldName,show) {
	if (show) {
		style="visible";
	} else {
		style="hidden";
	} 
	document.getElementById(PREFIX+fldName).style.visibility=style;
}

function isValidRequired(el) {
	return el.value!="";
}

function isValidState(el) {
	var states=new Array("","AL","AK","AZ","AR","CA","CO","CT","DE","DC","FL","GA",
		"HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI",
		"MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND",
		"OH","OK","OR","PW","PA","PR","RI","SC","SD","TN","TX","UT",
		"VT","VI","VA","WA","WV","WI","WY");
	var i=0;
	var ok=(el.value=="");
	while(!ok && i<states.length) {
		el.value=el.value.toUpperCase();
		ok=(el.value==states[i++]);
	}
	return ok;
}

function isValidZip(el) {
	var ok=(el.value=="");
	if (!ok) {
   		var re = /^\d{5}([\-]\d{4})?$/;
   		ok=(re.test(el.value));
   	}
   	return ok;
}

function isValidEmail(el) {
	var ok=(el.value=="");
    if (!ok) {
    	var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(2([0-4]\d|5[0-5])|1?\d{1,2})(\.(2([0-4]\d|5[0-5])|1?\d{1,2})){3} \])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    	ok=re.test(el.value);
   	}
   	return ok;
}	
   
function isValidPhone(el){
	var ok=(el.value=="");
    if (!ok) {
		var re = /^\(?[2-9]\d{2}[\)\.-]?\s?\d{3}[\s\.-]?\d{4}$/
 		ok=re.test(el.value);
 	}
 	return ok;
}


