﻿registerNS("blaze.util");

blaze.util.Valid=function(form,instant){
	this.form=this.getField(form);
	this.binds=[];
	this.flags=[];
	this.flagClass="flagField";
	this.isBound=false;
	this.onflag=null;
	this.onsubmit=null;
	this.instantValidation=instant;
	if(this.form!=null){this.onsubmit=this.form.onsubmit;}
	this.index=(blaze.util.Valid.Validators.push(this)-1);
	this.form.setAttribute("validIndex",this.index);
	this.bind();
	blaze.loadStyle("/lib/util/valid/valid.css",true);
}

blaze.util.Valid.Validators=[];
blaze.util.Valid.getValidator=function(f){
	if(f.form){f=f.form;}
	var v=f.getAttribute("validIndex");
	if(v){return blaze.util.Valid.Validators[new Number(v)];}
	return null;
}

blaze.util.Valid.autoValidate=function(instant){
	if(typeof(instant)=="undefined"){instant=true;}
	var forms=document.getElementsByTagName("form");
	for(var i=0;i<forms.length;i++){
		new blaze.util.Valid(forms[i],instant);
	}
}

blaze.util.Valid.prototype.validate=function(){
	if(!this.isBound){this.bind();}
	this.clear();
	for(var i=0;i<this.binds.length;i++){
		this.validateField(this.binds[i]);
	}
	if(this.flags&&this.flags.length>0){
		this.flags[0].focus();
		this.flags[0].select();
		return false;
	}
	return true;
}

blaze.util.Valid.prototype.clear=function(){
	this.flags=[];
	this.clearFlags();
}

blaze.util.Valid.prototype.validateField=function(el){
	el=this.getField(el);
	if(!el){return;}
	this.removeFlag(el);
	if(el.disabled||el.readOnly){return;}
	var a=el.className;
	if(!a){return;}
	var rules=a.split(" ");
	if(!rules){return;}
	var msg=el.getAttribute("message");
	for(var i=0;i<rules.length;i++){
		if(typeof(this[rules[i]])=="function"){
			this[rules[i]](el,msg);
		}
	}
}

blaze.util.Valid.prototype.bind=function(){
	if(!this.form){return false;}
	this.isBound=false;
	var els=this.getElements("input textarea select");
	if(!els){return false;}
	var caller=this;
	for(var i=0;i<els.length;i++){
		var atr=els[i].className;
		if(atr){
			this.binds[this.binds.length]=els[i];
			var eb=els[i].onblur;
			els[i].onblur=function(){
				caller.blur(this);if(eb){eb(this);}
			}
		}
	}
	this.onsubmit=this.form.onsubmit;
	this.form.onsubmit=function(){
		return caller.submit();
	}
	this.isBound=true;
	return true;
}

blaze.util.Valid.prototype.required=function(el,msg){
	el=this.getField(el);
	if(!el||!el.value||el.value.trim()==""){
		if(!msg){msg="This field is required";}
		this.flag(el,msg);
		return false;
	}
	return true;
}

blaze.util.Valid.prototype.email=function(el,msg){
	if(!msg){msg="This field must be a valid e-mail address";}
	return this.regEx(/^.+@.+\..{2,3}$/,el,msg);
}

blaze.util.Valid.prototype.phone=function(el,msg){
	if(!msg){msg="This field must be a valid phone number";}
	return this.regEx(/^\(?\d{3}\)?\s|[-.]\d{3}[-.]\d{4}$/,el,msg);
}

blaze.util.Valid.prototype.url=function(el,msg){
	if(!msg){msg="This field must be a valid web address";}
	return this.regEx(/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/,el,msg);
}

blaze.util.Valid.prototype.color=function(el,msg){
	if(!msg){msg="This field must be a valid HTML color";}
	return this.regEx(/#?([0-9a-fA-f]{6})/,el,msg);
}

blaze.util.Valid.prototype.number=function(el,msg){
	var error=false;
	el=this.getField(el);
	if(!el.value){return true;}
	try{
		var n=new Number(el.value);
		if(n.toString()=="NaN"){error=true;}else{return true;}
	}catch(c){
		error=true;
	}
	if(error){
		if(!msg){msg="This field must be a valid number";}
		this.flag(el,msg);
		return false;		
	}
}

blaze.util.Valid.prototype.date=function(el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	try{
		var d=new Date(el.value);
		if(d!="Invalid Date"){ return true; }
	}catch(c){}
	if(!msg){msg="This field must be a valid date";}
	this.flag(el,msg);
	return false;
}

blaze.util.Valid.prototype.time=function(el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	try{
		var d=new Date("1/1/0001 " + el.value);
		if(d!="Invalid Date"){ return true; }
	}catch(c){}
	if(!msg){msg="This field must be a valid time";}
	this.flag(el,msg);
	return false;
}

blaze.util.Valid.prototype.pattern=function(el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	if(!msg){msg="This field is not entered correctly";}
	return this.regEx(el.getAttribute("pattern"),el,msg);
}

blaze.util.Valid.prototype.regEx=function(re,el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	if(typeof(re)=="string"){re=new RegExp(re);}
	if(!re.test){return true;}
	if(re.test(el.value)==false){
		this.flag(el,msg);
		return false;
	}
	return true;
}

blaze.util.Valid.prototype.zip=function(el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	var re=/^(\d{5}-\d{4})|(\d{5})$/;
	if(re.test(el.value)==false){
		if(!msg){msg="This field must be a valid zip code";}
		this.flag(el,msg);
		return false;
	}
	return true;
}

blaze.util.Valid.prototype.state=function(el,msg){
	el=this.getField(el);
	if(!el.value){return true;}
	el.value=el.value.trim();
	var bad=false;
	if(el.value.length!=0&&el.value.length!=2){bad=true;}
	var s="AA AB AC AE AF AK AL AM AP AR AZ BC CA CO CT DC DE FL GA GU HI IA ID IL IN KS KY LA MA MB MD ME MI MN MO MS MT NB NC ND NE NF NH NJ NM NS NT NV NY OH OK ON OR PA PE PR QC RI SC SD SK TN TX UT VA VI VT WA WI WV WY YK ";
	if(s.indexOf(el.value.toUpperCase()+" ")<0){bad=true;}
	if(bad){
		if(!msg){msg="This field must be a valid US state";}
		this.flag(el,msg);
		return false;
	}
}

blaze.util.Valid.prototype.flag=function(el,msg){
	el=this.getField(el);
	this.flags[this.flags.length]=el;
	if(typeof(this.onflag)=="function"){
		this.onflag(el,msg);
	}else{
		this.addFlag(el,msg);
	}
}

blaze.util.Valid.prototype.blur=function(el){
	if(this.instantValidation){this.validateField(el);}
}

blaze.util.Valid.prototype.submit=function(){
	var hr=this.validate();
	if(hr){
		if(typeof(this.onsubmit)=="function"){hr=this.onsubmit(this.form);}
	}
	return hr;
}

blaze.util.Valid.prototype.addFlag=function(el,msg){
	el=this.getField(el);
	if(!el){return;}
	if(this.flagClass!=null){blaze.addClassName(el,this.flagClass);}
	var icn=el["flag"];
	if(!icn){
		icn=blaze.createIcon(blaze.getBase("/lib/util/valid/flag.png"),16,16);
		icn.className="flagIcon";
		el.parentNode.insertBefore(icn,el.nextSibling);
		el["flag"]=icn;
	}
	icn.title+=msg+" ";
}

blaze.util.Valid.prototype.removeFlag=function(el){
	el=this.getField(el);
	if(!el){return;}
	blaze.removeClassName(el,this.flagClass);
	var flag=el["flag"];
	if(flag){flag.parentNode.removeChild(flag);el["flag"]=null;}
}

blaze.util.Valid.prototype.clearFlags=function(){
	var els=this.getElements("input textarea");
	if(!els){return false;}
	for(var i=0;i<els.length;i++){this.removeFlag(els[i]);}
}

blaze.util.Valid.prototype.getField=function(name){
	if(typeof(name)=="object"){return name;}
	if(typeof(name)=="string"){
		if(this.form&&this.form[name]){return this.form[name];}
		return document.getElementById(name);
	}
}

blaze.util.Valid.prototype.getElements=function(names){	
	return blaze.getElements(names,this.form);
}