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 + "'}";
		}


		//on remplace les boutons submit par un bouton dans la toolbar pour que ce soit plus beau :)

		if(this.submitButtonType=='save'){
			var btnSubmitClass='JB_save';
			var labelSubmit=JTranslation.Save;

		}else if(this.submitButtonType=='submit'){
			var btnSubmitClass='JB_submit';
			var labelSubmit=JTranslation.Submit;
		}


		var btnOnclickHandler=function(e){
			if(JForm.validateCustomBefore() && JForm.validate() && JForm.validateCustomAfter()){
				$("form_"+JFormId).submit();
			}
		}


		if($('JFSubmit_'+ JFormId +'_top')){
			var submit=$("JFSubmit_" + JFormId + "_top");

			var btn=createJButton(labelSubmit,'',btnSubmitClass,btnOnclickHandler);

			Element.hide($("JFSubmit_" + JFormId + "_top"));
			$('JToolBarTop').appendChild(btn);
		}



		if($('JFSubmit_'+ JFormId +'_bottom')){

			var btn2=createJButton(labelSubmit,'',btnSubmitClass,btnOnclickHandler);

			Element.hide($("JFSubmit_" + JFormId + "_bottom"));
			$('JToolBarBottom').appendChild(btn2);
		}

		var btnDelete=$('btnDelete_' + JFormId);
		if(btnDelete){
			btnDelete.parentNode.parentNode.insertBefore(btn, btnDelete.parentNode);
		}




		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 trouvé 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);
		$(elementId).addClassName("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){

				//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

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

				}


				//error=false;

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


					//if(!error){

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

						switch(constraint){

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

							case "email":
								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;
								}
							break

						}
					//}

				});


			});

		});



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

		return(true);
	}




}
