Validate=function(){}

Validate.load=function(){
	var forms=DOM.getElementsByTagName("form");

	var form;
	for(var i=0;i<forms.length;i++){
		form=forms[i];

		if(STD.inString("validate",form.className)==true){
			form.onsubmit=function(){
				return Validate.validate(this);
			}
		}
	}
}
Validate.createError=function(value,element){
	Validate.clearError();

	var error=DOM.createElement("span",value);
	error.id="error";
	error.className="error";

	element.parentNode.insertBefore(error,element.nextSibling);

	window.scrollTo(0,element.offsetTop);
}
Validate.clearError=function(){
	var error=DOM.getElementById("error");
	if(error!=null){
		var parent=error.parentNode;
		parent.removeChild(error);
	}
}
Validate.validate=function(form){
	Validate.clearError();

	var elements;
	var element;
	var i=0;

	elements=DOM.getElementsByTagName("input",form);
	for(i=0;i<elements.length;i++){
		element=elements[i];

		if(Validate.run(element,form)==false){
			return false;
		}
	}

	elements=DOM.getElementsByTagName("textarea",form);
	for(i=0;i<elements.length;i++){
		element=elements[i];

		if(Validate.run(element,form)==false){
			return false;
		}
	}

	elements=DOM.getElementsByTagName("select",form);
	for(i=0;i<elements.length;i++){
		element=elements[i];

		if(Validate.run(element,form)==false){
			return false;
		}
	}

	return true;
}
Validate.run=function(element,form){
	if(DOM.hasClass(element,"validate")){
		if(Validate.check(element)==false){
			Validate.createError("You have entered an incorrect "+element.name,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-word")){
		if(Validate.checkWord(element)==false){
			Validate.createError("You have entered an incorrect "+element.name,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-length")){
		if(Validate.checkLength(element)==false){
			Validate.createError("You have entered to many or no characters in "+element.name+" - current length: "+element.value.length,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-integer")){
		if(Validate.checkInteger(element)==false){
			Validate.createError("You have entered an incorrect "+element.name,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-float")){
		if(Validate.checkFloat(element)==false){
			Validate.createError("You have entered an incorrect "+element.name,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-match")){
		if(Validate.checkMatch(element)==false){
			Validate.createError("You have a mismatch: "+element.id,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-cardnumber")){
		if(Validate.checkCardNumber(element)==false){
			Validate.createError("You have entered an incorrect card number",element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-cardverification")){
		if(Validate.checkCardVerification(element)==false){
			Validate.createError("You have entered an incorrect cvv2/cvc2/cid number",element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-name")){
		if(Validate.checkName(element)==false){
			Validate.createError("You have entered an incorrect name - "+element.name,element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-email")){
		if(Validate.checkEmail(element)==false){
			Validate.createError("Please enter a valid email",element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-phone")){
		if(Validate.checkPhone(element)==false){
			Validate.createError("Please enter a valid phone number",element);
			return false;
		}
	}

	if(DOM.hasClass(element,"validate-state")){
		if(Validate.checkState(element)==false){
			Validate.createError("Please choose a state",element);
			return false;
		}
	}

	return true;
}
Validate.check=function(element){
	if(element.value==""){
		return false;
	}

	return true;
}
Validate.checkWord=function(element){
	var re=new RegExp("[^A-Za-z]");

	if(Validate.check(element)==false || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkLength=function(element){
	if(Validate.check(element)==false || element.value.length>1000){
		return false;
	}

	return true;
}
Validate.checkInteger=function(element){
	var re=new RegExp("[^0-9]");

	if(Validate.check(element)==false || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkFloat=function(element){
	var re=new RegExp("^-?[0-9]*\\.?[0-9]+$");

	if(Validate.check(element)==false || re.test(element.value)==false){
		return false;
	}

	return true;
}
Validate.checkMatch=function(element){
	var id=element.getAttribute("id");
	var match_id=id.substr(id.indexOf("match-")+6);

	var match_element=DOM.getElementById(match_id);

	if(match_element==null || match_element.value!=element.value){
		return false;
	}

	return true;
}
Validate.checkCardNumber=function(element){
	var re=new RegExp("[^0-9]");

	if(Validate.check(element)==false || element.value.length<12 || element.value.length>19 || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkCardVerification=function(element){
	var re=new RegExp("[^0-9]");

	if(Validate.check(element)==false || element.value.length<3 || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkName=function(element){
	var re=new RegExp("[`~!@\\$%\\^\\*=\\+\\[\\]\\{\\}\\|\";:<>\\?]");

	if(Validate.check(element)==false || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkEmail=function(element){
	var re=new RegExp("^[A-Z0-9._%+-]+@([A-Z0-9-]+\\.)+[A-Z]{2,}$","i");

	if(Validate.check(element)==false || re.test(element.value)==false){
		return false;
	}

	return true;
}
Validate.checkPhone=function(element){
	var re=new RegExp("[^0-9-.() ]");

	if(Validate.check(element)==false || re.test(element.value)==true){
		return false;
	}

	return true;
}
Validate.checkState=function(element){
	var id=element.getAttribute("id");
	var country_id=id.replace("state","country");
	var country=DOM.getElementById(country_id);

	if(country==null){
		return true;
	}

	if(country.value=="US" && element.value==""){
		return false;
	}else{
		return true;
	}
}
