var aryvalidate = new Array;
var regexAnything = '^[0-9a-zA-Z]';
var regexZipCode = '^[0-9]{5}([- /]?[0-9]{4})?$';
var regexEmail = '^([0-9a-zA-Z]([-.\w_]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$';
var regexPhone = '^[\\(]{0,1}([0-9]){3}[\\)]{0,1}[ ||-]?([^0-1]){1}([0-9]){2}[ ]?[-]?[ ]?([0-9]){4}[ ]*((x){0,1}([0-9]){1,5}){0,1}$';
var regexCC  = '^3(?:[47]\\d([ -]?)\\d{4}(?:\\1\\d{4}){2}|0[0-5]\\d{11}|[68]\\d{12})$|^4(?:\\d\\d\\d)?([ -]?)\\d{4}(?:\\2\\d{4}){2}$|^6011([ -]?)\\d{4}(?:\\3\\d{4}){2}$|^5[1-5]\\d\\d([ -]?)\\d{4}(?:\\4\\d{4}){2}$|^2014\\d{11}$|^2149\\d{11}$|^2131\\d{11}$|^1800\\d{11}$|^3\\d{15}$';
var regexNumeric = '^([0-9]+(\\.)?[0-9]*)$';
var regexDate='^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$';
var regexTime='^\\d{1,2}:\\d{2}([ap]m)?$';

Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

function IsStyleDisplay(elem) {
	el=elem.parentNode;
	 do {
	   el=el.parentNode;
	   if (el.style.display=="none") {
			return false;
	   }
	 } while(el.nodeName.toLowerCase()!="body");
	 return (elem.disabled ? false : true);

}

var bFormProcessing = false;

function validate(elem,regex) {
	/*
	Regular Expression parameters for various fields
	Zip Code:  ^[0-9]{5}([- /]?[0-9]{4})?$
	Email: ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$
	Phone: ^[\\(]{0,1}([0-9]){3}[\\)]{0,1}[ ||-]?([^0-1]){1}([0-9]){2}[ ]?[-]?[ ]?([0-9]){4}[ ]*((x){0,1}([0-9]){1,5}){0,1}$
	Anything not starting with a special charachter (default) : ^[0-9a-zA-Z]
	*/
	if (!bFormProcessing) {
		bReturnValue=true;
		if (regex=="") {
			regex=regexAnything;
		}
		var re = new RegExp(regex);
		if (elem.type==undefined) { //Entire Form Validation

			bFormProcessing = true; // Prevent individual fields from validating if ENTER was hit and focus moves from form validation

			var elemfocus=-1;
			var elemmissed=0;
			var strElementSummary="";
			var aryRadioButtonNames=new Array();

			for (var i=0;i<elem.length;i++) {  //Whole Form
				if (elem.elements[i].id!=undefined) {
					var bElementIsDisplayed=IsStyleDisplay(elem.elements[i]);
					if (bElementIsDisplayed) {
						var strrfv = "rfv"+elem.elements[i].id; //.substr(3);
						rfv = document.getElementById(strrfv);
						if (aryvalidate[elem.elements[i].id]) {
							var re = new RegExp(aryvalidate[elem.elements[i].id]);
						}
						else {
							var re = new RegExp(regex);
						}
						if (elem.elements[i].type=="text" || elem.elements[i].type=="textarea" || elem.elements[i].type=="password" || elem.elements[i].type=="select-one") {
							if ((!elem.elements[i].value.match(re)) && document.getElementById(strrfv) && (elem.elements[i].type!=undefined)) {
								rfv.style.fontWeight = "bold";
								//elem.elements[i].style.backgroundColor="#FFCC99";
								elem.elements[i].style.border="2px solid #2d4215";
								strElementSummary=strElementSummary+"<li style='width: 70%; text-align: left;'>"+(elemmissed+1)+". ";
								strInnerText=rfv.innerText;
								if (rfv.innerText==undefined) {
									strInnerText=rfv.textContent;
								}
								if (strrfv.indexOf('Billing')>0) {
									strElementSummary=strElementSummary+"Billing "+strInnerText.replace(/\*\s?/ig,"")+"\n";
								}
								else if (strrfv.indexOf('Shipping')>0) {
									strElementSummary=strElementSummary+"Shipping "+strInnerText.replace(/\*\s?/ig,"")+"\n";
								}
								else {
									strElementSummary=strElementSummary+strInnerText.replace(/\*\s?/ig,"")+"\n";
								}
								strElementSummary+="</li>";
								bReturnValue=false;
								elemmissed++;
								if (elemfocus==-1) {
									elemfocus=i;
								}
							}
						} else if (elem.elements[i].type=="radio" || elem.elements[i].type=="checkbox") {
							try {
								var ary=elem.elements[i].id.split("_");
								var strrfv = "rfv"+ary[0]+'[]'; //.substr(3);
								rfv = document.getElementById(strrfv);
								if (rfv!=null) {
									//aryRdBtn=eval("document."+elem.name+"."+elem.elements[i].name);
									aryRdBtn=document.getElementsByName(ary[0]+'[]');
									bChecked=false;
									for (j = 0; j <aryRdBtn.length; j++) {
										//if (eval("document."+elem.name+"."+elem.elements[i].name+"["+j+"].checked;")) {
										tmpBtn=aryRdBtn[j];
										if (tmpBtn.checked) {
											bChecked=true;
											break;
										}
									}

									if (!bChecked && !aryRadioButtonNames.inArray(ary[0]+'[]')) {
										strElementSummary=strElementSummary+"<li>"+(elemmissed+1)+". ";
										strInnerText=rfv.innerText;
										rfv.style.fontWeight = "bold";
										if (rfv.innerText==undefined) {
											strInnerText=rfv.textContent;

										}
										if (strrfv.indexOf('Billing')>0) {
											strElementSummary=strElementSummary+"Billing "+strInnerText+"\n";
										}
										else if (strrfv.indexOf('Shipping')>0) {
											strElementSummary=strElementSummary+"Shipping "+strInnerText+"\n";
										}
										else {
											strElementSummary=strElementSummary+strInnerText+"\n";
										}
										strElementSummary+="</li>";
										bReturnValue=false;
										elemmissed++;
										if (elemfocus==-1) {
											elemfocus=j;
										}
										aryRadioButtonNames.push(ary[0]+'[]');
									}
								}
							} catch (e) {

							}
						}
					}
				}
			}
			if (!bReturnValue) {
				var strMessage="We caught "+elemmissed+" wrong fields";
				if (document.getElementById('alert')) {
					document.getElementById('alert').innerHTML="<p class='warning' style='width: auto;'>"+strMessage+"</p><ul style='width: 100%;'>"+strElementSummary+"</ul>";
					document.getElementById('alert').style.display="block";
				}
				else {
					var strStrippedSummary = strElementSummary.replace(/(<([^>]+)>)/ig,"");
					alert(strMessage+"\n"+strStrippedSummary);
				}
				elem.elements[elemfocus].focus();

				setTimeout('bFormProcessing = false',250); // gives is 1/4 second, just in case

			}
		}
		else { //Form Element Validation
			if (elem.type=="text" || elem.type=="textarea" || elem.type=="select-one" || elem.type=="password") {
				var strrfv = "rfv"+elem.id; //.substr(3);
				if (regex!=regexAnything) {
					aryvalidate[elem.id]=regex;
				}
				if ((!elem.value.match(re)) && document.getElementById(strrfv)) {
					rfv = document.getElementById(strrfv);
					rfv.style.fontWeight = "bold";
					//elem.style.backgroundColor="#FFCC99";
					elem.style.border="2px solid #2d4215";
					bReturnValue=false;
				}
				else {
					rfv = document.getElementById(strrfv);
					if (rfv) {
						rfv.style.fontWeight = "";
						rfv.style.color = "";
						elem.style.backgroundColor="";
						elem.style.border="";
						bReturnValue=true;
					}
				}
			}
		}
		return bReturnValue;
	}
	else {
		// There was a flag set saying that currently the whole form is being validated, so don't check the individual field
		return false;
	}

}


function doClear(theText) {
	if (theText.value == theText.defaultValue) {
		theText.value = ""
	}
}
