Validator=new Class({initialize:function(className,error,test,options){this.options=Object.extend({},options||{});this._test=test?test:function(v,elm){return true};this.error=error?error:'Validation failed.';this.className=className;},test:function(v,elm){return this._test(v,elm);}});var Validation=new Class({initialize:function(form,options){this.options=Object.extend({onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,useAlert:false,onFormValidate:function(result,form){},onElementValidate:function(result,elm){}},options||{});this.form=$(form);if(this.options.onSubmit)this.form.addEvent('submit',this.onSubmit.bind(this));if(this.options.immediate){var useTitles=this.options.useTitles;var callback=this.options.onElementValidate;var buseAlert=this.options.useAlert;this.form.getElementsBySelector("input, select, textarea").each(function(input){input.addEvent('blur',function(ev){Validation.validate(new Event(ev).target,{useTitle:useTitles,onElementValidate:callback,useAlert:buseAlert});});});}},onSubmit:function(ev){if(!this.validate())new Event(ev).stop();},validate:function(){var result=false;var useTitles=this.options.useTitles;var callback=this.options.onElementValidate;var buseAlert=this.options.useAlert;if(this.options.stopOnFirst){result=this.form.getElementsBySelector("input, select, textarea").all(function(elm){return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback,useAlert:buseAlert});});}else{result=this.form.getElementsBySelector("input, select, textarea").every(function(elm){return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback,useAlert:buseAlert});});}if(!result&&this.options.focusOnError){this.form.getElement('.validation-failed').focus()}this.options.onFormValidate(result,this.form);return result;},reset:function(){this.form.getElementsBySelector("input, select, textarea").each(Validation.reset);}});Validation=Object.extend(Validation,{validate:function(elm,options){options=Object.extend({useTitle:false,onElementValidate:function(result,elm){}},options||{});elm=$(elm);var cn=elm.className.split(" ");return result=cn.every(function(value){var test=Validation.test(value,elm,options.useTitle,options.useAlert);options.onElementValidate(test,elm);return test;});},test:function(name,elm,useTitle,useAlert){var v=Validation.get(name);var prop='__advice'+name.camelCase();if(Validation.isVisible(elm)&&!v.test($(elm).getValue(),elm)){if(!elm[prop]){var advice=Validation.getAdvice(name,elm);if(!$pick(advice,false)){var errorMsg=useTitle?((elm&&elm.title)?elm.title:v.error):v.error;advice=new Element('div').addClass('validation-advice').setProperty('id','advice-'+name+'-'+Validation.getElmID(elm)).setStyle('display','none').appendText(errorMsg);switch(elm.type.toLowerCase()){case'checkbox':case'radio':var p=$(elm.parentNode);if(p){p.adopt(advice);}else{advice.injectAfter($(elm));}break;default:advice.injectAfter($(elm));}advice=$('advice-'+name+'-'+Validation.getElmID(elm));}try{$(advice).setStyles({'display':'block','visibility':'hidden'}).effect('opacity').start(0,1)}catch(e){$(advice).setStyle('visibility','visible');}}elm[prop]=true;elm.removeClass('validation-passed');elm.addClass('validation-failed');if(useAlert)alert(v.error);return false;}else{var advice=Validation.getAdvice(name,elm);if(advice)advice.setStyle('display','none');elm[prop]='';elm.removeClass('validation-failed');elm.addClass('validation-passed');return true;}},isVisible:function(elm){while(elm.tagName!='BODY'){if($(elm).getStyle('display')=="none")return false;elm=elm.parentNode;}return true;},getAdvice:function(name,elm){var returnVal=false;try{returnVal=$('advice-'+name+'-'+Validation.getElmID(elm))}catch(e){}if(!returnVal){try{returnVal=$('advice-'+Validation.getElmID(elm))}catch(e){}}return returnVal;},getElmID:function(elm){return elm.id?elm.id:elm.name;},reset:function(elm){elm=$(elm);var cn=elm.className.split(" ");cn.each(function(value){var prop='__advice'+value.camelCase();if(elm[prop]){var advice=Validation.getAdvice(value,elm);advice.setStyle('display','none');elm[prop]='';}elm.removeClassName('validation-failed');elm.removeClassName('validation-passed');});},add:function(className,error,test,options){var nv={};nv[className]=new Validator(className,error,test,options);Validation.methods=Object.extend(Validation.methods,nv);},addAllThese:function(validators){var nv={};$A(validators).each(function(value){nv[value[0]]=new Validator(value[0],value[1],value[2],(value.length>3?value[3]:{}));});Validation.methods=Object.extend(Validation.methods,nv);},get:function(name){return Validation.methods[name]?Validation.methods[name]:new Validator();},methods:{}});Validation.add('IsEmpty','',function(v){return((v==null)||(v.length==0));});Validation.addAllThese([['required','Dit is een verplicht veld.',function(v){return!Validation.get('IsEmpty').test(v);}],['validate-number','Geef a.u.b. een geldig nummer voor dit veld.',function(v){return Validation.get('IsEmpty').test(v)||(!isNaN(v)&&!/^\s+$/.test(v));}],['validate-number-nl','Geef a.u.b. een geldig nummer voor dit veld.',function(v){return Validation.get('IsEmpty').test(v)||(/^[0-9]*(?:\,[0-9]{1,2})?$/.test(v));}],['validate-phone-nl','Geef a.u.b. een geldig telefoon voor dit veld.',function(v){return Validation.get('IsEmpty').test(v)||(/^((\+\d{1,3}( )?\(?\d\)?( )?\d{1,5})|(\(?\d{2,6}\)?))( )?(\d{3,4})( )?(\d{3,4})(( x| ext)\d{1,5}){0,1}$/.test(v));}],['validate-digits','Aleen nummers in dit veld (geen andere tekens zoals spaties en punten en commas.',function(v){return Validation.get('IsEmpty').test(v)||!/[^\d]/.test(v);}],['validate-alpha','Gebruik alleen letters (a-z) in dit veld.',function(v){return Validation.get('IsEmpty').test(v)||/^[a-zA-Z]+$/.test(v)}],['validate-alphanum','Gebruik alleen letters (a-z) of nummers (0-9) in dit veld (spaties zijn niet toegestaan)',function(v){return Validation.get('IsEmpty').test(v)||!/\W/.test(v)}],['validate-date','Geef een geldige datum voor dit veld',function(v){var test=new Date(v);return Validation.get('IsEmpty').test(v)||!isNaN(test);}],['validate-email','Geef een geldig e-mail adres (b.v Jansen@domain.com).',function(v){return Validation.get('IsEmpty').test(v)||/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)}],['validate-url','Geef een geldige URL.',function(v){return Validation.get('IsEmpty').test(v)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)}],['validate-date-au','Gebruik datum formaat: dd/mm/yyyy. b.v 17/03/2006 voor de 17de Maart, 2006.',function(v){if(Validation.get('IsEmpty').test(v))return true;var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(v))return false;var d=new Date(v.replace(regex,'$2/$1/$3'));return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear());}],['validate-date-nl','Gebruik datum formaat: dd-mm-yyyy. b.v 17-03-2006 voor de 17de Maart, 2006.',function(v){if(Validation.get('IsEmpty').test(v))return true;var regex=/^(\d{2})\-(\d{2})\-(\d{4})$/;if(!regex.test(v))return false;var d=new Date(v.replace(regex,'$2/$1/$3'));return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear());}],['validate-currency-dollar','Geef een geldig $ waarde. b.v $100.00 .',function(v){return Validation.get('IsEmpty').test(v)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)}],['validate-one-required','Selecteer een van de opties.',function(v,elm){var p=elm.parentNode;var options=p.getElementsByTagName('INPUT');if(options.length!=0){for(var i=0;i<options.length;i++){var el=options[i];if(['checkbox','radio'].contains(el.getProperty('type'))){if(el.getProperty('checked')==true){return true;}}else{return el.getProperty('value');}}}else{if($defined(elm.selectedIndex)&&$defined(elm.options[elm.selectedIndex].value)&&elm.options[elm.selectedIndex].value!=""){return true;}else{return false;}}}]]);var HideWhen=new Class({initialize:function(element,options){this.options=Object.extend({hidefunction:null},options||{});this.el=$(element);this.sHideWhat=this.el.getProperty('hidewhat');if(this.sHideWhat){this.sHideWhatAr=this.sHideWhat.split(",");this.iHideWhat=new Array();for(i=0;i<this.sHideWhatAr.length;i++){if($(this.sHideWhatAr[i]))this.iHideWhat.push($(this.sHideWhatAr[i]));};if(!this.iHideWhat)return false;}else{this.iHideFunction=this.el.getProperty('hidefunction');}this.checkHW();var iMultiVal=$$(this.el.tagName+'[name="'+this.el.name+'"]');var parent=this;iMultiVal.each(function(el){el.addEvent('click',function(e){this.checkHW(e);}.bind(parent));});},checkHW:function(){if(!this.options.hidefunction){var parent=this;this.sCheck=this.el.getProperty('hidewhen');if(!this.iHideFunction){if(eval(this.sCheck)==true){this.iHideWhat.each(function(el){parent.hide(el);});}else{this.iHideWhat.each(function(el){parent.show(el);});}}else{var ifunction=eval(this.iHideFunction);ifunction(this,this.el);}}else{try{this.options.hidefunction(this,this.el);}catch(e){}}},splat:function(el){return(el.length)?el:new Array(el);},toggle:function(el){this[this.visible?'hide':'show'](el);},show:function(el){var sStyle=(document.all&&!window.opera)?'block':'table-row';var ael=this.splat(el);for(i=0;i<ael.length;i++)ael[i].setStyle('display',sStyle);this.visible=true;},hide:function(el){var ael=this.splat(el);for(i=0;i<ael.length;i++)ael[i].setStyles({'display':'none'});this.visible=false;}});Array.extend({flatten:function(args2){var array=[];for(var i=0,l=args2.length;i<l;i++){var type=$type(args2[i]);if(!type)continue;array=array.concat((type=='array'||type=='collection'||type=='arguments')?Array.flatten(args2[i]):args2[i]);}return array;},removeEx:function(Index){var index=Index||-1;if(index<0&&Index<0){return this.pop();}else if(index<this.length){return(this.splice(Index,1)).getLast();}}});Element.extend({adoptEx:function(args){var array=[];array.flatten(args).each(function(element){element=$(element,true);if(element)this.appendChild(element);},this);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;}});var SubForm=new Class({initialize:function(options){this.options=Object.extend({target:null,name:'ExtendedDiv',classadd:'',classremove:'',textadd:'Add row',textremove:'Remove row'},options||{});this._forms=new Array();var $this=$(this.options.target);var child=$this.getChildren("div");if($defined($extend($this,this))==true){if(child.length>=1){$this.__defaultSubForm=child[0];$this.addEvent('updateButtons',$this.updateButtons);for(var i=0;i<child.length;i++){$this.addForm(child[i]);}}return $this;}else{alert('error initializing');}},updateButtons:function(){var addButton=new Element('button',{'type':'button','href':'#','class':'buttonx','events':{'click':function(){this.getParent().getParent().addForm();}}});addButton.innerHTML=this.options.textadd;addButton.addClass(this.options.classadd);var removeButton=new Element('button',{'type':'button','href':'#','class':'buttonx','events':{'click':function(){var ParentSubForm=this.getParent();ParentSubForm.getParent().removeForm(ParentSubForm);}}});removeButton.innerHTML=this.options.textremove;removeButton.addClass(this.options.classremove);var buttons=this.getElements('.buttonx');buttons.each(function(element){element.remove();});this._forms.each(function(form,index,_forms){var addButtonClone=addButton.clone();addButtonClone.cloneEvents(addButton,'click');var removeButtonClone=removeButton.clone();removeButtonClone.cloneEvents(removeButton,'click');var _l=_forms.length;if(_l==1){form.appendChild(addButtonClone);}else if((_l-1)==index){form.appendChild(removeButtonClone);form.appendChild(addButtonClone);}else{form.appendChild(removeButtonClone);}});},getName:function(){alert(this.options.name);},addForm:function(oldForm){if(typeof(oldForm)==="undefined"){var newForm=this.__defaultSubForm.cloneNode(true);this._forms.push(newForm);this.appendChild(newForm);this.fireEvent('updateButtons');}else{this._forms.push(oldForm);this.fireEvent('updateButtons');}},removeForm:function(SubFormEl){if(this._forms.length>0){var index=this._forms.indexOf(SubFormEl);var x=this._forms.removeEx(index);x.dispose();this.fireEvent('updateButtons');}else{alert('Unable to remove first form');}}});
