/*
 * Denbel.util.FormValidator
 * Package Util
 * Version 1.0
 * Author MFE
 * Copyright (c) 2008 Denbel
 */
Denbel.load("util.FormValidator");Denbel.load("util.FieldValidator");Denbel.util.FormValidator=function(b,a){if(YAHOO.lang.isString(b)){b=YAHOO.util.Dom.get(b);}if(!b){YAHOO.log("FormValidator needs a form to work with","error","Denbel.util.FormValidator");return;}this.form=b;this.config=new Denbel.lang.Object();if(a.blur){this.config.set("blur",a.blur);}if(a.errorContainer){this.config.set("errorContainer",a.errorContainer);}this.init();};Denbel.util.FormValidator.types=["required","email","alpha","numeric","maxlen","minlen","minnum","maxnum","phone","ip","url","match","uripart","remote","custom"];Denbel.util.FormValidator.TYPE_REQUIRED="required";Denbel.util.FormValidator.TYPE_EMAIL="email";Denbel.util.FormValidator.TYPE_ALPHA="alpha";Denbel.util.FormValidator.TYPE_NUMERIC="numeric";Denbel.util.FormValidator.TYPE_MAXLEN="maxlen";Denbel.util.FormValidator.TYPE_MAXNUM="maxnum";Denbel.util.FormValidator.TYPE_MINNUM="minnum";Denbel.util.FormValidator.TYPE_MAXIMUM="maxlen";Denbel.util.FormValidator.TYPE_MINLEN="minlen";Denbel.util.FormValidator.TYPE_MINIMUM="minlen";Denbel.util.FormValidator.TYPE_PHONE="phone";Denbel.util.FormValidator.TYPE_IPADDRESS="ip";Denbel.util.FormValidator.TYPE_IP="ip";Denbel.util.FormValidator.TYPE_URL="url";Denbel.util.FormValidator.TYPE_URIPART="uripart";Denbel.util.FormValidator.TYPE_MATCH="match";Denbel.util.FormValidator.TYPE_REMOTE="remote";Denbel.util.FormValidator.TYPE_RPC="remote";Denbel.util.FormValidator.TYPE_CUSTOM="custom";Denbel.util.FormValidator.EXP_MAIL=new RegExp(/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i);Denbel.util.FormValidator.EXP_ALPHA=new RegExp(/^[a-z]+$/i);Denbel.util.FormValidator.EXP_NUMERIC=new RegExp(/^[0-9\.\-]+$/);Denbel.util.FormValidator.EXP_PHONE=new RegExp(/(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/);Denbel.util.FormValidator.EXP_IP=new RegExp(/^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$/);Denbel.util.FormValidator.EXP_URL=new RegExp(/^http(s)?:\/\/([a-z\.])+$/i);Denbel.util.FormValidator.EXP_URIPART=new RegExp(/^([a-z0-9\-\+])+$/i);Denbel.util.FormValidator.getFieldLabel=function(d){if(YAHOO.lang.isString(d)){d=YAHOO.util.Dom.get(d);}if(!d){return null;}var e=document.getElementsByTagName("label");var a=d.getAttribute("id");var c=null;for(var b=0;b<e.length;b++){if(e[b].getAttribute("for")==a||e[b].getAttribute("id")==a+"_label"){if(e[b].childNodes.length>1){c=e[b].childNodes[1];}else{c=e[b];}return Denbel.util.XmlHelper.getElementValue(c);}}return null;};Denbel.util.FormValidator.exec=function(e,b){if(e.type!="remote"){return Denbel.util.FormValidator.check(e.getFieldValue(),e.type,e.extra);}var d=new Denbel.rpc.XmlRpcClient();var c=d.createMessage(e.extra.method);c.createAndAddParameter(e.getFieldValue());if(e.extra.params){c.createAndAddParameter(e.extra.params);}var a=true;if(b){a=false;}d.callService(c,{success:function(f){f.argument.validator.inProgress=false;f.argument.validator.isCompleted=true;f.argument.validator.error=false;if(f.data[0]==false){f.argument.validator.setError();}else{f.argument.validator.setValid();}if(f.argument.fire){f.argument.validator.completeEvent.fire({obj:f.argument.validator,result:true,source:this});}},failure:function(f){f.argument.validator.inProgress=false;f.argument.validator.isCompleted=true;f.argument.validator.error=true;f.argument.validator.setError(f.fault.get("faultString"));if(f.argument.fire){f.argument.validator.completeEvent.fire({obj:f.argument.validator,result:false,source:this});}},argument:{validator:e,fire:a}});};Denbel.util.FormValidator.check=function(b,a,d){var e=false;switch(a){case"required":e=(b!="");break;case"email":e=Denbel.util.FormValidator.EXP_MAIL.test(b);break;case"alpha":e=Denbel.util.FormValidator.EXP_ALPHA.test(b);break;case"numeric":e=Denbel.util.FormValidator.EXP_NUMERIC.test(b);break;case"maxlen":e=(b.length<=d);break;case"minlen":e=(b.length>=d);break;case"maxnum":e=(parseInt(b)<=parseInt(d));break;case"minnum":e=(parseInt(b)>=parseInt(d));break;case"phone":e=Denbel.util.FormValidator.EXP_PHONE.test(b);break;case"ip":e=Denbel.util.FormValidator.EXP_IP.test(b);break;case"url":e=Denbel.util.FormValidator.EXP_URL.test(b);break;case"uripart":e=Denbel.util.FormValidator.EXP_URIPART.test(b);break;case"match":if(YAHOO.lang.isString(d)){e=(b==d);}else{if(YAHOO.lang.isObject(d)){e=(b==d.value);}}break;case"custom":if(YAHOO.lang.isFunction(d)){e=d.call(this,b);}break;}return e;};Denbel.util.FormValidator.prototype={form:null,validators:null,allComplete:false,config:null,init:function(){this.validators=new Array();var e=this.form.elements;var c=Denbel.util.FormValidator.types;var a=null;var d=null;var f=null;for(var b=0;b<e.length;b++){for(a=0;a<c.length;a++){if(YAHOO.util.Dom.hasClass(e[b],c[a])){d=null;switch(c[a]){case"maxlen":d=parseInt(e[b].getAttribute("maxlength"));break;case"minlen":d=null;break;case"match":d=null;break;}f=new Denbel.util.FieldValidator(e[b],c[a],null,d);f.parent=this;f.apply();if(this.config.get("blur")){YAHOO.util.Event.addListener(e[b],"blur",function(j,k){YAHOO.util.Event.stopEvent(j);var h=k.getValidatorsByField(this);for(var g=0;g<h.length;g++){if(!h[g].validate()){break;}}},this);}this.validators.push(f);}}}return true;},isValidType:function(a){return Denbel.util.inArray(a,Denbel.util.FormValidator.types);},addValidator:function(c,a,b,d){return this.addValidation(c,a,b,d);},addValidation:function(c,a,b,e){if(!this.isValidType(a)){YAHOO.log("Incorrect validation type","error","Denbel.util.FormValidator");return false;}if(this.hasValidator(c,a)){this.removeValidator(c,a);}var d=new Denbel.util.FieldValidator(c,a,b,e);d.parent=this;if(!d.apply()){return false;}if(this.config.get("blur")){YAHOO.util.Event.removeListener(c,"blur");YAHOO.util.Event.addListener(c,"blur",function(h,j){YAHOO.util.Event.stopEvent(h);var g=j.getValidatorsByField(this);for(var f=0;f<g.length;f++){if(!g[f].validate()){break;}}},this);}this.validators.push(d);return true;},removeValidator:function(b,a){return this.removeValidation(b,a);},removeValidation:function(d,b){if(YAHOO.lang.isString(d)){d=YAHOO.util.Dom.get(d);}if(!d){return;}var e=null;var a=0;for(a=0;a<this.validators.length;a++){e=this.validators[a];if(e.field==d&&e.type==b){this.validators[a]=null;break;}}var c=this.validators;this.validators=new Array();for(a=0;a<c.length;a++){if(c[a]!=null){this.validators.push(c[a]);}}},hasValidator:function(c,b){if(YAHOO.lang.isString(c)){c=YAHOO.util.Dom.get(c);}if(!c){return false;}var d=null;for(var a=0;a<this.validators.length;a++){d=this.validators[a];if(d.field==c&&d.type==b){return true;}}return false;},getValidatorsByField:function(c){if(YAHOO.lang.isString(c)){c=YAHOO.util.Dom.get(c);}if(!c){return null;}if(!this.validators){this.validators=new Array();return null;}var b=[];for(var a=0;a<this.validators.length;a++){if(this.validators[a].field==c){b.push(this.validators[a]);}}return b;},invalidate:function(b){var a=this.getValidatorsByField(b);if(!a||a.length==0){return false;}a[0].setError();return true;},invalidateAll:function(){for(var a=0;a<this.validators.length;a++){this.invalidate(this.validators[a].field);}return true;},reset:function(){for(var a=0;a<this.validators.length;a++){this.validators[a].completeEvent.unsubscribeAll();}return true;},onComplete:function(d,g){if(g.waitForAll&&d.obj==d.source){return;}var a=g.parent;var h=g.callback;var f=true;var b=false;for(var c=0;c<a.validators.length;c++){if(!a.validators[c].isCompleted){f=false;break;}if(a.validators[c].error){b=true;}}if(f&&d.obj!=d.source){if(b){h.failure.call(a,{argument:h.argument});}else{h.success.call(a,{argument:h.argument});}}},hasInvalidValue:function(c){var b=this.getValidatorsByField(c);for(var a=0;a<b.length;a++){if(b[a].error){return true;}}return false;},validate:function(d){var b=true;var c=false;for(var a=0;a<this.validators.length;a++){if(this.hasInvalidValue(this.validators[a].field)){b=false;if(!this.config.get("errorContainer")){continue;}}if(!this.validators[a].validate()&&this.validators[a].type!=Denbel.util.FormValidator.TYPE_RPC){b=false;if(this.config.get("errorContainer")){break;}}if(this.validators[a].type==Denbel.util.FormValidator.TYPE_RPC){c=true;this.validators[a].completeEvent.unsubscribeAll();this.validators[a].completeEvent.subscribe(this.onComplete,{parent:this,callback:d,validator:this.validators[a],waitForAll:true});}}if(!c){if(b){d.success.call(this,{argument:d.argument});}else{d.failure.call(this,{argument:d.argument});}}}};Denbel.util.FieldValidator=function(c,a,b,d){if(YAHOO.lang.isString(c)){c=YAHOO.util.Dom.get(c);}if(!c){YAHOO.log("FieldValidator needs a field to work with","error","Denbel.util.FieldValidator");return;}if(!Denbel.util.inArray(a,Denbel.util.FormValidator.types)){YAHOO.log("Incorrect validation type","error","Denbel.util.FieldValidator");return;}this.field=c;this.type=a;if(!b){b="";}this.message=b;if(d===null){d=null;}this.extra=d;};Denbel.util.FieldValidator.prototype={completeEvent:(new YAHOO.util.CustomEvent("completed",this,true,YAHOO.util.CustomEvent.FLAT)),field:null,fieldId:null,parent:null,container:null,type:null,message:null,extra:null,inProgress:false,isCompleted:false,error:false,reset:function(){this.apply();},apply:function(){if(this.type=="maxlen"&&this.extra!=null){this.field.setAttribute("maxlength",this.extra.toString());}else{if(!YAHOO.util.Dom.hasClass(this.field,this.type)){YAHOO.util.Dom.addClass(this.field,this.type);}}this.fieldId=this.field.getAttribute("id");var a=this.field;var c=this.field.parentNode;if(c.tagName.toLowerCase()!="fieldset"){this.container=c;a=this.container;}var b=null;if(this.parent.config.get("errorContainer")){b=YAHOO.util.Dom.get(this.parent.config.get("errorContainer"));b.innerHTML="";}else{if(!YAHOO.util.Dom.inDocument(this.field.getAttribute("id")+"-info")){b=YAHOO.util.Dom.getNextSibling(a);if(b&&b.tagName.toLowerCase()=="span"){b.innerHTML="";b.setAttribute("id",this.field.getAttribute("id")+"-info");}else{b=document.createElement("span");b.setAttribute("id",this.field.getAttribute("id")+"-info");YAHOO.util.Dom.insertAfter(b,a);}}else{b=YAHOO.util.Dom.get(this.field.getAttribute("id")+"-info");if(b){b.innerHTML="";}}}return true;},getFieldValue:function(){return this.field.value;},setError:function(e){var b=this.field;if(this.container){b=this.container;}if(!e){e=this.message;}var d=b.parentNode;var c=null;if(this.parent.config.get("errorContainer")){c=YAHOO.util.Dom.get(this.parent.config.get("errorContainer"));}else{c=YAHOO.util.Dom.get(this.field.getAttribute("id")+"-info");}if(!this.parent.config.get("errorContainer")){c.innerHTML="";var a=document.createElement("img");a.setAttribute("alt","");a.setAttribute("src","/media/img/error.gif");a.setAttribute("style","margin-left:5px;");c.appendChild(a);c.innerHTML+="&nbsp;&nbsp;"+e;YAHOO.util.Dom.addClass(d,"error");}else{c.innerHTML=e;}this.isCompleted=true;this.inProgress=false;this.error=true;this.completeEvent.fire({obj:this,result:false,source:this});},setValid:function(){var b=this.field;if(this.container){b=this.container;}var d=b.parentNode;var c=null;if(this.parent.config.get("errorContainer")){c=YAHOO.util.Dom.get(this.parent.config.get("errorContainer"));}else{c=YAHOO.util.Dom.get(this.field.getAttribute("id")+"-info");}if(!this.parent.config.get("errorContainer")){c.innerHTML="";var a=document.createElement("img");a.setAttribute("alt","");a.setAttribute("src","/media/img/checkbullet.gif");a.setAttribute("style","margin-left:5px;");c.appendChild(a);YAHOO.util.Dom.removeClass(d,"error");}this.inProgress=false;this.isCompleted=true;this.error=false;this.completeEvent.fire({obj:this,result:true,source:this});},validate:function(){if(this.getFieldValue()==""&&(this.type!="required")){this.setValid();return true;}this.inProgress=true;this.isCompleted=false;this.error=false;var d=null;if(this.parent.config.get("errorContainer")){d=YAHOO.util.Dom.get(this.parent.config.get("errorContainer"));}else{d=YAHOO.util.Dom.get(this.field.getAttribute("id")+"-info");}d.innerHTML="";if(!this.parent.config.get("errorContainer")){var b=document.createElement("img");b.setAttribute("alt","");b.setAttribute("src","/media/img/spinner.gif");b.setAttribute("style","margin-left:5px;");d.appendChild(b);}var a=this.field;if(this.container){a=this.container;}var c=a.parentNode;if(Denbel.util.FormValidator.exec(this,false)){if(this.type!="remote"){this.setValid();return true;}}else{if(this.type!="remote"){this.setError();return false;}}}};
