// Require visicore.js
VISIFORMS = new visiforms();
event_add(window,'load',function(){VISIFORMS.init();},false);

function visiforms()
{
	this.onFormCheckError = null;
	this.errorMsg = "Erreur sur la page...";
}

visiforms.prototype.init = function ()
{
	var frms=document.getElementsByTagName('form');
	if (frms)
	{
		for (var i=0;i<frms.length;i++)
		{ 
			this.form_init(frms[i],true); 
		}
	}
}
visiforms.prototype.set_input = function (aInputID,aValue)
{
	var vInput = document.getElementById(aInputID);
	if (vInput)
	{ vInput.value = aValue; }
	else
	{ alert('Input ['+aInputID+ '] non trouvé!'); }
}

visiforms.prototype.get_input = function (aInputID,aDefValue)
{
	var vInput = document.getElementById(aInputID);
	if (vInput)
	{ return vInput.value; }
	else
	{ return aDefValue; }
}

visiforms.prototype.set_select = function (aID,aValue)
{
	var vSelect = document.getElementById(aID);
	if (vSelect)
	{ 
		for(var i=0; i<vSelect.options.length; i++)
		{
			if (vSelect.options[i].value == aValue)
			{
				vSelect.selectedIndex=i;
				break;
			}
		}
	}
}

visiforms.prototype.get_select = function (aID,aDefValue)
{
	var vSelect = document.getElementById(aID);
	var vResult = aDefValue;
	if (vSelect)
	{ 
		vResult = vSelect.options[vSelect.selectedIndex].value;
	}
	return vResult;
}

/**
 * aSelectedDef = s�l�ction� par defaut
 * aSelected = s�l�ctionn�
 */
visiforms.prototype.select_option_add = function (aElmID,aText,aValue,aSelectedDef,aSelected)
{
	vEl = document.getElementById(aElmID);
	if (vEl)
	{
		var vO = new Option (aText,aValue,aSelectedDef,aSelected);
		if (_isIE())
		{ vEl.add(vO); }
		else
		{ vEl.add(vO,null); }
	}
}

visiforms.prototype.select_option_exist = function (aSelectId,aVal)
{
	var vEl = document.getElementById(aSelectId);
	if (vEl)
	{
		for (var vI = 0; vI < vEl.length; vI++) 
		{
    		if (vEl.options[vI].value == aVal)	return true;
		}
    }
	return false;
}

visiforms.prototype.select_options_clear = function (aSelectId)
{
	var vEl = document.getElementById(aSelectId);
	if (vEl)
	{
		vEl.options.length = 0;
		return true;
    }
	return false;
}

visiforms.prototype.select_options_selectAll = function (aSelectId)
{
	var vSel = document.getElementById(aSelectId);
	if (vSel)
	{
		for (var vI = vSel.length-1; vI >=0 ; vI--) 
		{
    		vSel.options[vI].selected=true;
    	}
	}
}
/**
 * Ajoute 
 * aExp est un json du type:
 * {EXPREG:"expression reguliere",MIN:500,MAX:1000} 
 * 
 */
visiforms.prototype.validate_input = function(aId,aExp)
{
 	var vElm = getEl(aId);
 	var r=false;
 	if (vElm)
 	{
 			var vR=true;
 			if (aExp.EXPREG)
 			{
	 			var re = new RegExp(aExp.EXPREG,"");
	 			vR=vR && re.test(vElm.value);
 			}
 			if (aExp.MIN)
 			{
 				vR = vR && vElm.value>=aExp.MIN;
 			}
 			if (aExp.MAX)
 			{
 				vR = vR && vElm.value<=aExp.MAX;
 			}
 			r = this.set_valid(vElm,vR);
 			vElm.check_result = r;
 	}
 	return r;
}
visiforms.prototype.set_valid = function(aElm,aValid)
{
 	var el = getEl(aElm);
 	if (el)
 	{
 			if (aValid)
 			{
 				class_remove(el,'novalid');
 				class_add(el,'valid');
 				return true;
 			}
 			else
 			{
 				class_remove(el,'valid');
 				class_add(el,'novalid');
 			}
 	}
 	return false;
}
visiforms.prototype.error_display = function(aElm,aErrStr)
{
	var el=getEl(aElm);
	if (el && el.getAttribute('error_display'))
	{
		eel=getEl(el.getAttribute('error_display'))
		if (eel) 
		{ 
			eel.innerHTML=aErrStr;
			eel.style.display = "";
		}
	}
}
visiforms.prototype.error_clear = function(aElm)
{
	var el=getEl(aElm);
	if (el && el.getAttribute('error_display'))
	{
		eel=getEl(el.getAttribute('error_display'))
		if (eel)
		{
			eel.innerHTML="";
			eel.style.display = "none";
		}
	}
}
visiforms.prototype.validate_email = function(aElm)
{
	var r=this.validate_input(aElm,{EXPREG:"^[a-z0-9_.-]+@[a-z0-9._-]+\\.[a-z]+$"});
	if (!r) 
	{ this.error_display(aElm,"Format non valide"); }
	else
	{ this.error_clear(aElm);}
	return r;
}

visiforms.prototype.validate_twin = function(aElm,aTwin)
{
	var el1=getEl(aElm),el2=getEl(aTwin),r=false,t=this;
	if (el1 && el2)
	{
		r = el1.value == el2.value;
		t.set_valid(el1,r);
		t.set_valid(el2,r);
		el1.check_result = r;
		el2.check_result = r;
	}
	return r;
}

visiforms.prototype.validate_oneOf = function(aElm,aOther)
{
	var el1=getEl(aElm),el2=getEl(aOther),r=false,t=this;
	if (el1 && el2)
	{
		r = el1.value || el2.value;
		t.set_valid(el1,r);
		t.set_valid(el2,r);
		el1.check_result = r;
		el2.check_result = r;
	}
	return r;
}

/**
 * Verifie seulement que la valeur n'est pas vide
 */
visiforms.prototype.validate_required = function(aElm)
{
	var el=getEl(aElm),r=false;
	if (el)
	{
		/*
		 * Si il n'y a pas eu de verification du contenu au prealable
		 * on estime que la verification est OK
		 */ 
		if (el.check_result == undefined)
		{ el.check_result = true; }
		
		/*
		 * Si il eu une verification OK au prealable
		 * on verifie le parametre requis
		 * sinon on fait rien etant donnée que le champ est deja estimé
		 * non valide par le CHECK
		 */
		if (el.check_result)
		{ 
			//console.debug(el,el.value);
			r = this.set_valid(el,el.value);
		}
	}
	return r;
}

visiforms.prototype.form_init = function(aForm,aNoValidate)
{
	var t=this, f=getEl(aForm);
	if (f)
	{
		if (f.elements)
		{
			for (var i=0;i<f.elements.length;i++)
			{ this.elm_init(f.elements[i]); }
		}
		f.onsubmit = function(){return t.form_check(f);};
	}
	if (!aNoValidate)
	{
		this.form_validate(aForm);
	}
}

visiforms.prototype.form_check = function(aForm)
{
	var f= getEl(aForm);
	var t=this, r = t.form_validate(f);
	if (!r) 
	{	
		var msg = t.get_errorMsg(f.id);
		if (t.onFormCheckError) 
		{ 
			return t.onFormCheckError(); 
		}
		else
		{ 
			alert(msg);
			return false;
		}
	}
	return true;
}

/**
 * Recherche dans le form tous les inputs a initialiser
 * Initialiser = valider, rajouter des fonctions pour la validation etc...
 */
visiforms.prototype.form_validate = function(aForm)
{
	var f=getEl(aForm);
	var rt=true; 
	if (f && f.elements)
	{
		for (var i=0;i<f.elements.length;i++)
		{ 
			var rl = this.elm_validate(f.elements[i]); 
			if (rl===false ) rt=false; 
		}
	}
	return rt;
}

visiforms.prototype.get_errorMsg = function(aFormId)
{
	var hid=getEl(aFormId+"_errorMsg");
	if (hid)
	{
		return hid.value;
	}
	return this.errorMsg;
}



/**
 * Valide l'element en fonction de ses attributs
 */
visiforms.prototype.elm_validate = function(aElm)
{
	var el=getEl(aElm);
	var r=undefined;
	var req = el.getAttribute('required') && el.getAttribute('required')!="false";
	if (el.nodeName=="INPUT"||el.nodeName=="SELECT"||el.nodeName=="TEXTAREA")
	{ 
		el.check_result = true;
		if (req) 
		{ 
			r = this.validate_required(aElm); 
		}
		// Ci-dessous ...if(r &&... car si r==false pas la peine de verifier 
		if (r && el.getAttribute('check'))
		{ r = this.elm_check(el,el.getAttribute('check')); }
	}
	return r;
}

visiforms.prototype.add_events = function(aElm,aFunc)
{
	event_add(aElm,'keyup',aFunc,false);
	event_add(aElm,'blur',aFunc,false);
}
/**
 * Attribut les fonctions de validation au elements
 * ne fait aucune validation a ce niveau
 */
visiforms.prototype.elm_init = function(aElm)
{
	var t=this, el=getEl(aElm);
	switch (el.nodeName)
	{
		case 'INPUT':
			// Attribut REQUIRED
			if (el.getAttribute('required') && el.getAttribute('required')!="false")
			{ t.add_events(el,function(){t.validate_required(el);}); }
			
			// Attribut TWIN
			if (el.getAttribute('twin'))
			{
				var tw = el.getAttribute('twin');
				t.add_events(el,function(){t.validate_twin(el,tw);});
			}
			
			// Attribut ONEOF
			if (el.getAttribute('oneof'))
			{
				var tw = el.getAttribute('oneof');
				t.add_events(el,function(){t.validate_oneOf(el,tw);});
			}
			
			// Attribut CHECK
			if (el.getAttribute('check'))
			{
				var fmt = el.getAttribute('check').toLowerCase();
				//Bug sous IE event_add(el,'keyup',function(){VISIFORMS.check_elm(this,fmt);},false);
				t.add_events(el,function(){t.elm_check(el,fmt);});
			}

			// Attribut FORMAT
			if (el.getAttribute('format'))
			{
				var fmt = el.getAttribute('format').toUpperCase();
				//Bug sous IE event_add(el,'keyup',function(){VISIFORMS.format(this,fmt);},false);
				t.add_events(el,function(){t.format(el,fmt);});
			}
			break; //INPUT

		case "SELECT":
			// Attribut REQUIRED
			if (el.getAttribute('required') && el.getAttribute('required')!="false")
			{ event_add(el,'change',function(){t.validate_required(el);},false);}
			//{el.onchange = function(){t.validate_required(aElm);};}
			break; // SELECT

		case "TEXTAREA":
			// Attribut REQUIRED
			if (el.getAttribute('required') && el.getAttribute('required')!="false")
			{ t.add_events(el,function(){t.validate_required(el);}); }
			break; // SELECT
	}
}

visiforms.prototype.elm_check = function(aId,aFmt)
{
	//console.debug('check '+aFmt);
	var r = undefined;
	switch (aFmt) 
	{
		case "email":
			r = this.validate_email(aId);	 
			break;
	}
	return r;
}

visiforms.prototype.format = function(aId,aFmt)
{
 		var vElm = getEl(aId);
 		if (vElm)
 		{
			switch (aFmt) 
			{
				case "UPPER":
					vElm.value = format_UPPER(vElm.value);	 
					break;
				case "REF":
					vElm.value = format_REF(vElm.value);	 
					break;
				case "INT":
					vElm.value = format_INT(vElm.value);	 
					break;
				case "FLOAT":
					vElm.value = format_FLOAT(vElm.value);	 
					break;
			}
 		}
}
