/*

	Class itemtoCheck

	> Verification javascript de la validité d'un input dont la reference est passe en param <

 

 Utilisation :



	1 - Construction

			 itemToCheck(

				identifiant du champ [Object],  

				not null [boolean],

				type de format attendu [string: 'email', 'string' ...],

				longueur mini attendue [integer (-1 pour desactiver)],

				langueur max attendue [integer (-1 pour desactiver)],

				Label du champ utilise lors de l'affichage de message d'erreur

				)

	2 - Creation de date a partir de 3 champs (jour/mois/annee)

			createDate(

				identifiant du champ Day,

				identifiant du champ Month,

				identifiant du champ Year,

				Separateur a utiliser entre les champs

				Type de date (us/fr)

				)

				

	3 - Verification de la validite

			Check() return true/false

		

*/





function itemToCheck(input, bRequired, formatType, minLength, maxLength, minValue, maxValue, errorLabel, Tarray)

{

	

	this.input=input;

	this.bRequired=bRequired;

	this.formatType=formatType;

	this.minLength=minLength;

	this.maxLength=maxLength;

	this.minValue=minValue;

	this.maxValue=maxValue;

	this.errorLabel=errorLabel;

	this.preOK=true;

	this.Tarray=Tarray;

	

		

//////////////////////////////////////	

// fonctions 'public'

//////////////////////////////////////



	// verification de la validite du champ

	this.Check=function()

	{

		

	

		

		// FIXME le multi radio est mal reconnu :-(

		if( this.formatType=="radio" )

		{

			this.input.type="radio";

		}

		

		switch(this.input.type)

		{

			case 'text':

			case 'hidden':

			case 'password':

				if( this.bRequired )

				{

					if( this.input.value=="" )

					{

						alert(T("The @#"+this.errorLabel+"#@ cannot be empty",this.Tarray));

						return false;

					}

				}



				if( this.input.value!="")

				{

					 if( !checkFormat(this.formatType, this.input.value, this.input.name, this.errorLabel, this.Tarray) )

						return false;

				}

				return ( checkLength(this.minLength, this.maxLength, this.input.value, this.input.name, this.errorLabel, this.Tarray)

						&& checkNumber(this.minValue, this.maxValue, this.input.value, this.input.name, this.errorLabel, this.Tarray) );

			break;

			



			case 'file':

				if( this.bRequired && this.input.value=="" )

				{

					alert(T("The @#"+this.errorLabel+"#@ cannot be empty",this.Tarray));

					return false;

				}

				return checkLength(this.minLength, this.maxLength, this.input.value, this.input.name, this.errorLabel, this.Tarray);				

			break;	

			

			case 'radio':

			case 'checkbox':

				var bCheck=false;

				if( this.bRequired )

				{

					for( var i=0;i<this.input.length;i++ )

					{

						if( this.input[i].checked==true )

							bCheck=true;

					}

					if( !bCheck )

					{

						alert(T("Please, Check one of the @#"+this.errorLabel+"#@ 's element",this.Tarray));

						return false;

					}

				}			

				return true;

			break;



			case 'textarea':

				

				if( this.bRequired )

				{

					if( this.input.value=="" )

					{

						alert(T("The @#"+this.errorLabel+"#@ cannot be empty",this.Tarray));

						return false;

					}

				}

				if( this.input.value!="" )

				{

					return ( checkLength(this.minLength, this.maxLength, this.input.value, this.input.name, this.errorLabel, this.Tarray)

							&& checkNumber(this.minValue, this.maxValue, this.input.value, this.input.name, this.errorLabel, this.Tarray) );

				}

				return true;

			break;	



			default:

			

				// detection de select

				

				if( this.input.type.indexOf("select")!=-1 )

				{

					if( this.bRequired )

					{

						if( this.input.value=="-1" || this.input.selectedIndex==-1)

						{

							alert(T("Please choose a value into the @#"+this.errorLabel+"#@ 's list", this.Tarray));

							return false;

						}

					}

					return true;

				}

				else

				{

					alert(T("Unrecognized input type ("+this.input.type+")", this.Tarray));

					return true;

				}

			break;

		}

	}

	

	

	

	

	// Creation d'un champ date a partir de 3 champs separes

	this.createDate=function(inputD, inputM, inputY, sep, type)

	{



		Tday=new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

		

		if( inputD.type.indexOf("select")!=-1 )

		{	

			var day=new Number(inputD.options[inputD.selectedIndex].value);

			var month=new Number(inputM.options[inputM.selectedIndex].value);

			var year=new Number(inputY.options[inputY.selectedIndex].value);

			

			d=new Number(day);

			m=new Number(month);

			if( Tday[(m.valueOf())-1]<d.valueOf() )

			{

				alert(T("The @#"+this.errorLabel+"#@ is invalid", this.Tarray));

				return false;

			}



			(day.length==1)?day="0"+day:void(0);

			(month.length==1)?month="0"+month:void(0);

			

			switch(type)

			{	

				case 'us':	

					this.input.value=month+sep+day+sep+year;

				break;

				case 'fr':

					this.input.value=day+sep+month+sep+year;

				break;

				default :

					this.input.value=month+sep+day+sep+year;

				break;

			}

			return true;

		}

		

		

		// verification validite jour

		if( inputD.value<0 

			|| inputD.value>31 

			|| inputD.value.length>2 

			|| (inputD.value=="" && this.bRequired) 

			|| !checkFormat("integer",inputD.value, inputD.name, this.Tarray))

		{

			

			alert(T("The day for @#"+this.errorLabel+"#@ is invalid", this.Tarray));

			this.preOk=false;

			inputD.value="";

			inputD.focus();

			return false;

		}

		

		

		

		// verification validite mois

		if( inputM.value<0 

			|| inputM.value>12 

			|| inputM.value.length>2 

			|| (inputM.value=="" && this.bRequired) 

			|| !checkFormat("integer",inputM.value, inputM.name, this.Tarray) )

		{

			alert(T("The month for @#"+this.errorLabel+"#@ is invalid",  this.Tarray));

			this.preOk=false;

			inputM.value="";

			inputM.focus();

			return false;

		}

		

		

		// verification validite annee

		if( inputY.value<0 

			|| (inputY.value.length!=4 && inputY.value.length!=0) 

			|| (inputY.value=="" && this.bRequired) 

			|| !checkFormat("integer",inputY.value, inputY.name, this.Tarray) )

		{

			alert(T("The year for @#"+this.errorLabel+"#@ is invalid", this.Tarray));

			this.preOk=false;

			inputY.value="";

			inputY.focus();

			return false;

		}

		

		d=new Number(inputD.value);

		m=new Number(inputM.value);

		if( Tday[(m.valueOf())-1]<d.valueOf() )

		{

			alert(T("The @#"+this.errorLabel+"#@ is invalid", this.Tarray));

			return false;

		}

	

		// jour et mois sur 2 digits

		(inputD.value.length==1)?inputD.value="0"+inputD.value:void(0);

		(inputM.value.length==1)?inputM.value="0"+inputM.value:void(0);

			

				

		switch(type)

		{

			case 'us':	

				this.input.value=inputM.value+sep+inputD.value+sep+inputY.value;

			break;

			case 'fr':

				this.input.value=inputD.value+sep+inputM.value+sep+inputY.value;

			break;

			default :

				this.input.value=inputM.value+sep+inputD.value+sep+inputY.value;

			break;

		}

		

		

	}

	

	

	

	

	

	

	

//////////////////////////////////////

// fonctions 'privates'

//////////////////////////////////////

	

	

	// Traduction a la volée

	function T(mesg, Tarray)

	{

		

		

		if( mesg.indexOf('@#')==-1 )

		{

			trans=Tarray[mesg];

			if( !trans )

				return mesg;

			else

				return trans;

		}

		

		arrayMesg=new Array();

		arrayTemp=new Array();

		arrayTrans=new Array();

		values=new Array();

		arrayMesg=mesg.split(unescape("%20"));

		var tmp;

		var j=0;

		var t=0;

		var bEndVar=true;

		

		for( i=0; i<arrayMesg.length; i++ )

		{

			if( arrayMesg[i].indexOf("@#")!=-1 )

			{

				pos1=arrayMesg[i].indexOf("@#")+2;

				if( (pos2=arrayMesg[i].indexOf("#@"))==-1 )

				{

					pos2=arrayMesg[i].length;

					bEndVar=false;

				}

				values[j]=arrayMesg[i].substring(pos1, pos2);

				arrayTemp[t]="@#val#@";

				j++;

				t++;

			}

			else if( (pos2=arrayMesg[i].indexOf("#@"))!=-1 )

			{

				tmp=values[j-1];

				values[j-1]=tmp+unescape("%20")+arrayMesg[i].substring(0, pos2);

				bEndVar=true;

			}

			else if( !bEndVar )

			{

				tmp=values[j-1];

				values[j-1]=tmp+unescape("%20")+arrayMesg[i];

			}

			else if( arrayMesg[i].indexOf("#@")==-1 && arrayMesg[i].indexOf("@#")==-1 )

			{

				arrayTemp[t]=arrayMesg[i];

				t++;

			}

		}



		trans=Tarray[arrayTemp.join(unescape("%20"))];



		if( !trans )

			arrayTrans=arrayTemp;

		else

			arrayTrans=trans.split(unescape("%20"));		



		j=0;

		for( i=0; i<arrayTrans.length; i++ )

		{

			if( arrayTrans[i].indexOf("@#val#@")!=-1 )

			{

				arrayTrans[i]=T(values[j], Tarray);

				j++;

			}

		}

		return arrayTrans.join(unescape("%20"));

	}







	

	// verification du format de la chaine

	/* formats acceptes:

		- email

		- integer

		- float

		- alphanumerique

		- string

		- object

		- boolean

	*/

	function checkFormat(formatType, value, name, errorLabel, Tarray)

	{

		

		switch(formatType)

		{

			case 'email':

				

				var at=false;

				var pt=false;

				var wrongChar=false;

				

				// verif de la presence d'un '@'

				if( value.indexOf('@')!=-1 )

				{

					at=true;

				}

				

				// verif de la presence d'un '.'

				if( value.indexOf('.')!=-1 )

				{

					pt=true;

				}

					

				// recherche de caracteres invalides	

				for( var i=0; i<value.length; i++ )

				{

					var aChar=value.substring(i,i+1);

                	if( !((aChar>="A" && aChar<="Z")

						|| (aChar >= "a" && aChar<="z")

						|| (aChar=="@")

						|| (aChar==".")

						|| (aChar=="_")

						|| (aChar=="-")

						|| (aChar>="0" && aChar<="9")) )

					{

						wrongChar=true;	

					}

				}

				

				

				if( (wrongChar==true) || (at==false) || (pt==false) )

				{

					alert(T("@#"+errorLabel+"#@: is not a valid email adress", Tarray));

					return false;

				}

				else

				{

					return true;

				}

			break;



			

			case 'url':

				if( value.substring(0,7)!='http://' && value.substring(0,7)!='http://' )

				{

					alert(T("@#"+errorLabel+"#@: is not a valid url", Tarray));

					return false;

				}

				return true;

			break;

			

			

			case 'alphanumL':

				var wrongChar=false;

				

				for( var i=0; i<value.length; i++ )

				{

					var aChar=value.substring(i,i+1);

                	if( !( (aChar>="0" && aChar<="9")

                		|| (aChar==".") 

                		|| (aChar>="A" && aChar<="Z")

                		|| (aChar>="a" && aChar<="z")

                		|| (aChar=="-") 

                		|| (aChar=="+")                 		

                		|| (aChar=="'") 

                		|| (aChar==unescape("%20"))

                		|| (aChar=="é") 

                		|| (aChar=="è")

                		|| (aChar=="à")

                		|| (aChar=="â")

                		|| (aChar=="ê")

                		|| (aChar=="û")

                		|| (aChar=="î")

                		|| (aChar=="ô")

                		

                		) )

					{

						wrongChar=true;	

					}

				}

				

				if( wrongChar==true )

				{

					alert(T("@#"+errorLabel+"#@: is not a @#"+formatType+"#@ value", Tarray));

					return false;

				}

				

				return true;

			break;

			

			

			

			case 'integer':

			case 'float':	

			case 'alphanum':

				var wrongChar=false;

				

				for( var i=0; i<value.length; i++ )

				{

					var aChar=value.substring(i,i+1);

                	if( !( (aChar>="0" && aChar<="9")

                		|| (aChar=="." && formatType=="float") 

                		|| ( ( (aChar>="A" && aChar<="Z") || (aChar>="a" && aChar<="z")) && formatType=="alphanum") ) )

					{

						wrongChar=true;	

					}

				}

				

				if( wrongChar==true )

				{

					alert(T("@#"+errorLabel+"#@: is not a @#"+formatType+"#@ value", Tarray));

					return false;

				}

				

				return true;

			break;

			

			

			case 'string':

				var wrongChar=false;

				

				for( var i=0; i<value.length; i++ )

				{

					var aChar=value.substring(i,i+1);

                	if( !((aChar>="A" && aChar<="Z") || (aChar>="a" && aChar<="z") || aChar==unescape("%20")) )

					{

						wrongChar=true;	

					}

				}

				

				if( wrongChar==true )

				{

					alert(T("@#"+errorLabel+"#@: is not a @#"+formatType+"#@ value", Tarray));

					return false;

				}

				

				return true;

			break;

			

			case 'object':

			case 'boolean':

				if( typeof(value)!=formatType)

				{

					alert(T("Invalid format: @#"+typeof(value)+"#@", Tarray));

					return false;

				}

				return true;

			break;

				

			case 'anything':

				return true;

				

			default:

				return true;

		}

		

	}

	

	

	// verification des bornes d'une valeur numerique

	function checkNumber(min, max, value, name, errorLabel, Tarray)

	{

		if( min!=-1 && value<min )

		{

			alert(T("@#"+errorLabel+"#@ minimum value should be @#"+min+"#@", Tarray));

			return false;

		}

		

		if( max!=-1 && value>max )

		{

			alert(T("@#"+errorLabel+"#@ maximum value should be @#"+max+"#@", Tarray));

			return false;

		}

		return true;

	}

	

	

	// verification de la longueur de la chaine

	function checkLength(min, max, value, name, errorLabel, Tarray)

	{

	

		if( min!=-1 && value.length<min )

		{

			alert(T("@#"+errorLabel+"#@ needs at least @#"+min+"#@ characters", Tarray));

			return false;

		}

		

		if( max!=-1 && value.length>max )

		{

			alert(T("@#"+errorLabel+"#@ needs at most @#"+max+"#@ characters", Tarray));

			return false;

		}

		return true;

	}

	

	

}



