function getFirstParentTag(element,tagName){
	element=element.parentNode
	while(element){
		if(element.tagName==tagName){
			return(element);
		}
		element=element.parentNode;
	}
	return(false);
}



var JForm={

	JFormId: null,
	JFormNode: null,
	focusFieldset: null,
	validation:null,
	submitButtonType:null,

	init: function(JFormId){

		//On commence par ajouter une confirmation sur le bouton delete
		var btnDelete=$('btnDelete_' + JFormId);
		if(btnDelete){
			btnDelete.href="javascript:if(confirm('"+ JTranslation.confirmDelete +"')){document.location.href='"+ btnDelete.href + "'}";
		}




		this.JFormNode=$('JFormId');
		if(this.validation==null){
			this.validation=[];
		}
		this.validation[JFormId]=new Array();
		var elements=document.getElementsByClassName("JFormElement",this.JFormNode);
		var e0=elements[0];
		elements.each(function(element){
			var oldOnFocus=element.onfocus;
			element.onfocus=function(e){
				if(oldOnFocus){
					oldOnFocus(e);
				}
				var fs=getFirstParentTag(element,"FIELDSET");
				if(!fs){
					console.warn("Error > pas trouve de fieldset");
					return(false);
				}
				
				Element.addClassName(fs,"JFormFieldSetActive");

				if(this.focusFieldset && this.focusFieldset!=fs){
					Element.removeClassName(this.focusFieldset,"JFormFieldSetActive");
				}

				this.focusFieldset=fs;

			}.bind(this);
		}.bind(this));
		e0.focus();
	},




	clearAllUlErrorContainer: function(){
		$$('ul.fieldSetError').each(function(o){
			o.parentNode.removeChild(o);
		});
	},


	addErrorInfo: function(fieldsetNumber,label,txt,elementId){

		var txt=" "+txt;
		//on regarde si il y a deja un container UL pour ce fieldset
		var fs=$$("fieldset.JFormFieldSet")[fieldsetNumber];
		var ul=fs.getElementsBySelector("ul.fieldSetError")[0];
		if(typeof(ul)=="undefined"){
			var ul=Builder.node("ul",{className:'fieldSetError'});
			fs.firstChild.parentNode.insertBefore(ul,fs.firstChild);
		}
		var li=Builder.node("li",[
			Builder.node("label",label),txt
		]);
		ul.appendChild(li);
		Element.addClassName(elementId, "JFElementError");

	},



	validateCustomBefore: function(){
		return(true);
	},

	validateCustomAfter: function(){
		return(true);
	},


	validate: function(){
		error=false;
		this.clearAllUlErrorContainer();
		JForm.validation.each(function(fieldset,fieldsetNumber){

			fieldset.each(function(el){

				el.errorFound=false;


				//on associe la fonction getValue a l'element suivant son type
				switch(el.type){

					case "JFormSelect":
					case "JFormInputText":
					case "JFormTextarea":
						el.getValue=function(){ return($F(el.id)) };
					break

					case "JFormInputCheckbox":
						el.getValue=function(){ return($(el.id).checked) };
					break;
					
					case "JFormInputRadios":
						el.getValue=function(){ 
							var v="";
							$$('input.'+el.id).each(function(radio){
								radio.checked ? v=radio.value : '';
							}.bind(this));
							return(v);
						};
						

					break;
					
					case "JFormTextareaFCK":
						el.getValue=function(){ return(FCKeditorAPI.GetInstance(el.id).GetHTML()); };
					break;

					default:
						el.getValue=function(){ console.warn("Error: no GetValue function for : " + el.id);return('') };

				}




				//On parcourt toutes les contraintes
				$H(el.constraints).each(function(constraint){


					if(!el.errorFound){

						var constraint=constraint[0];
						var options=constraint[1];

						switch(constraint){

							case "required":
								if(el.getValue().blank()){
									JForm.addErrorInfo(fieldsetNumber, el.label, JTranslation.isEmpty, el.id);
									error=true;
									el.errorFound=true;
								}
							break
							
							
							case "empty":
								if(!el.getValue().blank()){
									JForm.addErrorInfo(fieldsetNumber, el.label, JTranslation.mustBeEmpty, el.id);
									error=true;
									el.errorFound=true;
								}
							break							

							case "email":
								if(!el.getValue().blank()){
									var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/;
									if (!filter.test(el.getValue())){
										JForm.addErrorInfo(fieldsetNumber, el.label, JTranslation.isNotValid, el.id);
										error=true;
										el.errorFound=true;
									}
								}
							break
							
							
							case "checked":
								if(!el.getValue()){
									JForm.addErrorInfo(fieldsetNumber, el.label, JTranslation.mustBeChecked, el.id);
									error=true;
									el.errorFound=true;
								}
							break;
							

						}
					}

				});


			});

		});



		if(error){
			var ulError=$$('ul.fieldSetError')[0];
			ulError.parentNode.scrollTo();
			new Effect.Highlight(ulError);
			return(false);
		}

		return(true);
	}




}
