function characterCount(s1,s2,l){
	var s1=s1,s2=s2,l=l,o1=null,o2=null,c2=jml.obj,c3=jml.events,dCache;
	function update(){
		var s=o1.value,n=s.length;
		if(n>l) n=l;
		if(n>=l){
			n=l;
			s=s.substr(0,l);
			c2.set(o1,'value',s);
		}
		c2.set(o2,'innerHTML','Caractères restants '+(l-n)+' / '+l);		
	}
	function init(){
		o1=getObj(s1);
		o2=getObj(s2);
		if(!isset(s1)||!isset(s2)) return;
		o1.maxlength=l;
		c3.add(o1,'change',update);
		c3.add(o1,'keyup',update);
		update();
	}
	c3.add(window,'load',init);
}
var formUtils= new function(){
	var isAllSelected=false;
	return {
		submit:function(o,b){
			var o=getObj(o),b=b||false;
			if(!isset(o)) return;
			if(b){
				o.reset();
			}else{
				if(isset(o.onsubmit)){
					if(o.onsubmit()) o.submit();
				}
			}
		},
		reset:function(o){
			this.submit(o,true);
			var k=uiFormValidatorDrlk;
			for(var j in k) if(isset(k[j].clear)) k[j].clear();						
		},
		getSelected:function(o){return o.options[o.selectedIndex];},
		getValue:function(o){
			return isset(o.options)? this.getSelected(o).value : isset(o.value)?o.value:null;
		},
		selectAll:function(o){
			var c1=jml.xml.node,x1=c1.byProximity(c1.parent(o,5),1);
			var n1=c1.length(x1);
			for(var i=0;i<n1;i++) c1.byPath('0.0.0.0.0',c1.byPosition(i,x1)).checked=!isAllSelected;
			 isAllSelected=!isAllSelected;
		}
	}
};
function formAlternative(skinType,tId){
	var c1=jml.server,c2=jml.obj,skinType=skinType,tId=isset(tId)?tId:null,ccg=true;
	function callScript(s,o,b,f){
		var cx=new c1.connection();
		cx.url='/ajax/'+s;
		cx.data=o;
		cx.onLoad=function(d){if(isFunc(f)) f(d);};
		cx.onError=function(id,msg){alert(id+", msg = "+ msg);};
		cx.connect();
	}
	function flush(o1){
		var o0=o1.options;
		var n1=o0.length-1;
		for(var i=n1;i>=0;i--){if(isset(o0[i])&&isset(o0[i].value)) c3.remove(o0[i]);}
	}
	function populate(o,t){
		for(var i in o){
			var e=o[i],x1=c3.create('OPTION',t);
			x1.value=e.value;
			x1.innerHTML=e.label;
		}		
	}	
	return {
		$:function(){return this;},
		changeSelect:function(o1,b,sx,fp){
			if(!ccg) return;
			ccg=false;
			var s1=sx||formUtils.getValue(o1),b=b||false,currentPaId=typeof(window['currentPaId'])=='undefined'?'':window['currentPaId'];
			var fp=fp||getObj('_form_name').value;
			if(isEmpty(s1)) return;
			callScript('dynamicbox',{pa_id:isEmpty(currentPaId)?0:currentPaId,name:'categoryForm',category_id:s1,skin:skinType,package:'forms',_form_name:fp},true,function(o2){
				var k=uiFormValidatorDrlk;
				for(var j in k) if(isset(k[j].clear)) k[j].clear();
				var rg1='<script[^>]*>([\\S\\s]*?)<\/script>';
				var cdk=o2.match(rg1);
				if(isset(cdk) && isset(cdk[0])) o2=o2.replace(cdk[0],'');
				c2.set(tId,'innerHTML',o2);
				ccg=true;
				var e 	= document.createElement('script');
				e.type	='text/javascript';
				e.text 	= cdk[1];
				//e.src
				document.body.appendChild(e);
				if(isset(pageInitialisation)) pageInitialisation();
				if(b&&isset(advancedSearch.forceDisplay)) advancedSearch.forceDisplay();
			});
		},		
		changeBox:function(o2){
			callScript('staticFormSection',false,function(){
				
			});
		}
	}.$();
}
function formValidator(f,l){
	var formId=f||null,formObj,lang=l||'fr',depth=99100,uit=window.uiFormValidatorDrlk,ifrm=null;
	if(!isset(uit)) uit=window.uiFormValidatorDrlk={};
	var get={
		value:function(o){return isset(o)?o.type=='radio'?o.checked?o.value:null:isset(o.value)?o.value:null:null;},
		item:function(o){
			var r=null;
			if(!isset(o)) return r;
			var o=formObj[o];
			if(!isset(o)) return;
			if(isset(o.nodeName)){r=o;}
			else{
				if(isset(o[0].nodeName)){
					for(var i=0;i<o.length;i++){if(isset(o[i].checked)&&o[i].checked) r=o[i];}
					if(!isset(r)) r=o[0];
				}
			}
			return r;
		},
		type:function(o){return o.type;}
	};
	var set={
		focus:function(o){
			if(isset(o.focus)) o.focus();
			if(isset(o.select)) o.select();
		}
	};
	function display(o,s){
		if(!isset(o)) return;
		var c1=jml.obj,c2=jml.xml.node,c3=jml.events,o1=o.o,x1=c2.create('DIV',document.body),x2=c2.create('DIV',document.body),ts='ui_'+o1.name;
		if(ifrm==null&&lower(navigator.userAgent).match('msie 6')!=null){
			ifrm=c2.create('DIV',document.body);
			c1.set(ifrm,'innerHTML','<iframe></iframe>');
			c1.set(ifrm,'className','ie6UnderFloatBugForm');
		}
		c1.set(x1,'innerHTML',s);
		c1.set(x2,'innerHTML','&nbsp;');
		c1.set(x1,'className','formError01');
		c1.set(x2,'className','errorArrow01');
		var n1=c1.get(o1,'offsetLeft'),n2=c1.get(o1,'offsetTop'),n3=c1.get(o1,'offsetWidth'),n4=c1.get(o1,'offsetHeight'),n5=c1.get(x2,'offsetWidth'),n6=n3<120?120:n3;
		c1.set(x1,'width',n6+'px');
		c1.set(x1,'left',n1+'px');
		c1.set(x1,'top',(n2+n4)+'px');
		c1.set(x1,'zIndex',depth-1);
		c1.set(x2,'left',(n1-(n5-(jml.browser.type=='msie'?8:6)))+'px');
		c1.set(x2,'top',(n2-2)+'px');
		c1.set(x2,'zIndex',depth);
		o.err=x2;
		dCache.push(o);
		if(!isset(f)){set.focus(o1);f=o1;}
		c3.add(x2,'mouseover',function(){
			if(ifrm!=null){
				c1.set(ifrm,'width',(n6+10)+'px');
				c1.set(ifrm,'height',(c1.get(x1,'offsetHeight')+10)+'px');
				c1.set(ifrm,'left',n1+'px');
				c1.set(ifrm,'top',(n2+n4)+'px');
				c1.set(ifrm,'visibility','visible');
			}
			c1.set(x1,'visibility','visible');
			var b=false;
			if(isset(o1.id)&&typeof(jmlUISuggestor_virtual)!='undefined') b=(jmlUISuggestor_virtual[o1.id]);
			if(!b) set.focus(o1);
		});
		c3.add(x2,'mouseout',function(){
			c1.set(x1,'visibility','hidden');
			c1.set(ifrm,'visibility','hidden');
		});
		function clear(b){
			var b=b||false;
			if(!b) c3.remove(o1,'keydown',data);
			if(!b) c3.remove(o1,'change',data);
			c2.remove(x1);
			if(!b) c2.remove(x2);
			if(ifrm!=null)c1.set(ifrm,'visibility','hidden');
			if(!b) delete window.uiFormValidatorDrlk[ts];
		}
		function data(e){
			var e=c3.initialize(e);
			if(c3.getKey(e,true)!=-1)clear();
		}
		var to1=formObj[o1.name];
		if(isset(to1.length)&&!isset(to1.nodeName)){
			for(var i=0;i<to1.length;i++) c3.add(to1[i],'click',data);
		}else{
			c3.add(o1,'keydown',data);
			c3.add(o1,'change',data);
			if(lower(o1.type)=='checkbox') c3.add(o1,'click',data);
		}
		depth-=2;
		window.uiFormValidatorDrlk[ts]={clear:clear};		
		return false;
	}
	function parse(a1,a2){
		var a3=mixArr(a1,a2),r=true,fI=null;
		function setPoint(o){
			var s1=window.location.href;
			var s2=s1.match(/^.[^#]*/);
			if(s2==null)s2=s1;
			if(s2!=null&&isset(s2[0])) s2=s2[0];
			if(fI==null){
				if(isset(o.id)&&!isEmpty(o.id)){
					window.location.href=s2+"#"+o.id;
					fI=o.id;
				}else{
					if(isset(formId)){
						window.location.href=s2+"#"+formId;
						fI=formId;
					}
				}
			}
		}
		for(var i=0;i<a3.length;i++){
			var e=new function(){
				var g=a3[i],o=get.item(g.input);
				return isset(o)?{o:o,v:get.value(o),n:o.name,t:g.validation,c:g.custom,msg:isset(g.msg)?g.msg:msg[g.validation][lang]}:{o:null,v:null,n:null,t:null,c:null};
			}
			if(!isset(validationType[e.t])){
				r=false;
				alert(msg+" ==> "+e.n);
				return r;
			}
			var l,b1=e.t=='empty';
			if(!b1&&isset(e.v)) l=validationType['empty'](e.v,e.o);
			if(!l&&!b1&&e.t!='checked'&&e.t!='selected'){
				r=display(e,e.msg);
				setPoint(e.o);
			}else{
				l=validationType[e.t](e.v,e.o);
				if(!l){
					r=display(e,e.msg);
					setPoint(e.o);
				}
			}
		}		
		return r;
	}
	var validationType={
		empty:function(v,o){return !isEmpty(v);},
		alpha:function(v,o){return v.match(/\d+/)==null;},
		numeric:function(v,o){return v.match(/\D+/)==null;},
		alphanumeric:function(v,o){return v.match(/.+/)!=null;},
		noSpecialChars:function(v,o){return v.match(/[^\w.]+/)==null;},
		email:function(v,o){return lower(v).match(/^([\w-]+)(\.[\w-]+)*@([a-z\d-]+)(\.[a-z\d-]+)*(\.[a-z]{2,4})$/)!=null;},
		phone:function(v,o){return v.match(/^[0-9\-\(\)\ \.-]{10,14}$/)!=null;},
		postal:function(v,o){return upper(v).match(/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/)!=null;},
		checked:function(v,o){return o.checked;},
		selected:function(v,o){return isset(v)&&!isEmpty(v);},
		price:function(v,o){return v.match(/^[\d,\.\s]+$/)!=null&&v.match(/[\d]+/)!=null;}
	};
	var msg={
		empty:{fr:"Ce champ est vide!",en:"Error"},
		alpha:{fr:"Les caractères numériques ne sont pas permis!",en:"Error"},
		numeric:{fr:"Ce champ devrait contenir uniquement des caractères numériques!",en:"Error"},
		alphanumeric:{fr:"Ce champ devrait uniquement contenir des caractères alpha-numériques!",en:"Error"},
		noSpecialChars:{fr:"Ce champ devrait uniquement contenir des caractères alpha-numériques et ne pas contenir de caractères spéciaux tel que é ou / ou &, etc.",en:"Error"},
		email:{fr:"Cette addresse de courriel n'est pas valide!",en:"Error"},
		phone:{fr:"Ce numéro de téléphone n'est pas valide!",en:"Error"},
		postal:{fr:"Ce code postal n'est pas valide!",en:"Error"},
		validation:{fr:"Ce type de validation n'est pas disponible!",en:"Error"},
		checked:{fr:"Vous devez cocher ce champ afin de poursuivre.",en:"Error"},
		selected:{fr:"Il n'y a aucune option de sélectionner!",en:"Error"},
		price:{fr:"Le prix ne peut contenir que des chiffres, des virgules, des points ou des espaces. Il ne peut y avoir d'autres caractères",en:"Error"}
	};	
	return {
		$:function(){
			var h=this;
			jml.events.add(document.body,'__textResize',delegate(h,'errorPosition'));
			jml.events.add(window,'resize',delegate(h,'errorPosition'));			
			return this;
		},
		canValidate:true,
		errorPosition:function(){
			var c1=jml.obj,c2=jml.xml.node;
			if(typeof(dCache)=='undefined') return;
			if(!isset(dCache)) return;
			var a=dCache;			
			for(var i=0;i<a.length;i++){
				var e=a[i];
				var n1=c1.get(e.o,'offsetLeft'),n2=c1.get(e.o,'offsetTop'),n3=c1.get(e.o,'offsetWidth'),n4=c1.get(e.o,'offsetHeight'),n5=c1.get(e.err,'offsetWidth'),n6=n3<120?120:n3;
				c1.set(e.err,'left',(n1-(n5-(jml.browser.type=='msie'?8:6)))+'px');
				c1.set(e.err,'top',(n2-2)+'px');
			}
		},
		fields:{statics:[],dynamics:[]},
		resetError:function(){
			var k=uiFormValidatorDrlk;
			for(var j in k) if(isset(k[j].clear)) k[j].clear();			
		},
		validate:function(){
			dCache=[];
			formObj=getObj(formId);
			return isset(formObj)?parse(this.fields.statics,this.fields.dynamics):false;
		}
	}.$();
}