/*
	FORM.JS - Fonctions de test de formulaires

	Fonctions fournies :
	
		string getQueryStringByForm ( oFrom p_objForm )
		string replaceQueryStringArgument( string p_strQueryString, string p_strParamToAddName, string p_strParamToAddValue, boolean p_bAddIfNotExist )
		boolean isEmail( string p_strEmail ) 
		boolean isNum( string p_strValue, boolean p_bAllowFloat )
		boolean isValideDate( string p_Date ) 
		boolean isOnElementChecked( oInput p_objRadio )
		boolean isTelephone( string p_strTel )
		boolean isCP( string p_strCP ) 
		boolean isDepartement( string p_strDep ) 
		boolean isFileExtension( string p_strFileName, string|array p_aExtendions )
		boolean isLikeCP( string p_strCP )

		string internalTrimLeft( string p_strChaine, char p_Caractere )
*/


// [ getQueryStringByForm ] ------------------------------------------------------------

//	Entrées :	un objet de type Formulaire
//	Sortie :	Une chaine de type QueryString ( sous la forme "nom1=val1&nom2=val2&" )
// 	Description :	Fonction qui renvoie une querystring générée par tous les champs du formulaire

function getQueryStringByForm ( p_objForm )
{
	var i = 0;
	var strQueryString = "";
	
	for ( i = 0 ; i < p_objForm.elements.length ; i ++ )
	{
		switch ( p_objForm.elements[ i ].type )
		{
			case "checkbox" :
				if ( p_objForm.elements[ i ].checked )	strQueryString += p_objForm.elements[ i ].name + "=" + p_objForm.elements[ i ].checked;
				break;
			
			case "select-one" :
				strQueryString += p_objForm.elements[ i ].name + "=" + escape ( p_objForm.elements[ i ].options [ p_objForm.elements[ i ].selectedIndex ].value );
				break;

			default :
				strQueryString += p_objForm.elements[ i ].name + "=" + escape ( p_objForm.elements[ i ].value );
				break;
		}

		if ( i + 1 < p_objForm.elements.length )  strQueryString += "&";
	}
	
	return strQueryString;
}


// [ replaceQueryStringArgument ] ------------------------------------------------------------

//	Entrées :	la chaine QueryString à modifier
//			le nom du parametre à modifier
//			la valeur de se parametre
//			un flag indiquant si on doit l'ajouter s'il n'existe pas deja
//	Sortie :	La chaine de type QueryString modifié ( sous la forme "nom1=val1&nom2=val2&" )
// 	Description :	Fonction qui permet d'editer une querystring

function replaceQueryStringArgument( p_strQueryString, p_strParamToAddName, p_strParamToAddValue, p_bAddIfNotExist )
{
	var bFind = false;
	var iStartPos = 0;
	var iEndPos = 0;
	var strChaine = "";

	// Evite un bug si le premier parametre est celui qu'on recherche ... SUPER ALEX ;)
	if ( p_strQueryString.indexOf( "?" ) >= 0 && p_strQueryString.indexOf( "?param_null" ) < 0  )
		p_strQueryString = p_strQueryString.replace( "?", "?param_null=value_null&" )

	while ( !bFind )
	{
		iStartPos = p_strQueryString.indexOf( p_strParamToAddName, iStartPos );
		if ( iStartPos < 0 ) break;
		if ( ( iStartPos == 0 || p_strQueryString.charAt( iStartPos - 1 ) == '&' ) && p_strQueryString.charAt( iStartPos + p_strParamToAddName.length ) == '=' )
		{
			bFind = true;
			break;
		}
		iStartPos ++;
	}
	
	if ( bFind )
	{
		iEndPos = p_strQueryString.indexOf( "&", iStartPos + 1 );
		if ( iEndPos < 0 ) iEndPos = p_strQueryString.length;
		strChaine = p_strQueryString.substring( 0, iStartPos ) + p_strParamToAddName + "=" + p_strParamToAddValue + p_strQueryString.substring( iEndPos, p_strQueryString.length + 1 );
	}
	else if ( p_bAddIfNotExist )
	{
		if ( p_strQueryString.indexOf( "?" ) >= 0 )
			strChaine = p_strQueryString + "&" + p_strParamToAddName + "=" + escape( p_strParamToAddValue );
		else
			strChaine = p_strQueryString + "?" + p_strParamToAddName + "=" + escape( p_strParamToAddValue );
	}
	else
	{
		strChaine = p_strQueryString;
	}
	
	return strChaine;
}


// [ isEmail ] ------------------------------------------------------------

//	Entrées :	la chaine contenant l'email à tester
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider un email

function isEmail( p_strEmail ) 
{
	var bTestArobas	= ( p_strEmail.lastIndexOf("@") > 0 );
	var bTestPoint	= ( p_strEmail.lastIndexOf(".") > p_strEmail.lastIndexOf("@") + 2 );
	var bTestLength	= ( p_strEmail.lastIndexOf("@") < p_strEmail.lastIndexOf(".") );
	var bTestPoint2	= ( p_strEmail.lastIndexOf(".") < p_strEmail.length - 2 );

	if( bTestArobas && bTestPoint && bTestLength && bTestPoint2 )
	{
		return true;
	}
	return false;
}


// [ isNum ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le nombre à tester
//			un flag pour indiquer si le nombre doit etre un int ou un float
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider un nombre

function isNum( p_strValue, p_bAllowFloat )
{
	var iPosFloat;
	var strPart1, strPart2
	
	p_strValue = internalTrimLeft( p_strValue, "0" );
	
	if( p_strValue.indexOf( '.' ) > 0 )
	{
		iPosFloat = p_strValue.indexOf( '.' );
	}
	else if( p_strValue.indexOf(',') > 0)
	{
		iPosFloat = p_strValue.indexOf( ',' );
	}
	else
		iPosFloat = -1;
	if( iPosFloat >= 0 )
	{
		strPart1 = p_strValue.substring( 0, iPosFloat );
		strPart2 = p_strValue.substring( iPosFloat+1, p_strValue.length );
	}
	else 
	{
		strPart1 = p_strValue;
		strPart2 = 0;
	}
	if ( !p_bAllowFloat && iPosFloat >= 0 ) return false;
	if( strPart1 != parseInt( strPart1 ) || strPart2 != parseInt( strPart2 ) ) return false;
	
	return true;
}
	

// [ isValideDate ] ------------------------------------------------------------

//	Entrées :	la chaine contenant la date à tester
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider une date de la forme jj/mm/aaaa

function isValideDate( p_Date ) 
{
	var iPos1 = p_Date.indexOf( "/" );
	var iPos2 = p_Date.lastIndexOf( "/" );
	var day, month, year;
	var aMaxJours = Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
	
	if ( iPos1 <= 0 || iPos2 <= 0 )
	{
		return false;
	}	
	
	day	= p_Date.substring( 0, iPos1 );
	month	= p_Date.substring( iPos1 + 1, iPos2 );
	year	= p_Date.substring( iPos2 + 1, p_Date.length );
	
	if ( !isNum( day, false ) || !isNum( month, false ) || !isNum( year, false ) )
	{
		return false;
	}
	
	day	= parseInt( day );
	month	= internalParseInt( month );
	year	= parseInt( year );
	
	if ( year <= 50 )			year += 1900;
	else if ( year >= 50 && year < 100 )	year += 2000;
	// year
	if ( year < 1950 || year > 2050 ) return false;
	
	// month
	if ( month > 12 || month <= 0 ) return false;
	
	// day
	if ( day <= 0 || day > aMaxJours[ month - 1 ] ) return false;
	
	
	return true;
}

// [ isOneElementChecked ] ------------------------------------------------------------

//	Entrées :	l'objet de type Input Checkbox à tester
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de savoir si au moins une des checkbox d'un meme groupe ( meme nom ) est sélectionnée
	
function isOneElementChecked( p_objRadio )
{
	var i = 0;
	
	for ( i = 0 ; i < p_objRadio.length ; i++ ) 
	{
		if( p_objRadio[ i ].checked )
		{
			return true;
		}
	}
	return false;
}

	
// [ isTelephone ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le numéro de téléphone à tester
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de tester un numéro de téléphone de la forme :
//			01 01 01 01 01 ou 01.01.01.01.01 ou 01,01,01,01,01 ou simplement 0101010101

function isTelephone( p_strTel )
{
	var i = 0;
	
	if ( p_strTel.length < 10 )
	{
		return false;
	}
	
	for ( i = 0 ; i < p_strTel.length ; i++ )
	{	
		if( !( ( p_strTel.charAt( i ) >= '0' && p_strTel.charAt( i ) <= '9' ) || p_strTel.charAt( i ) == '.' || p_strTel.charAt( i ) == ' '  || p_strTel.charAt( i ) == ',' ) )	
		{	
			return false;
		}	
	}
	return true;	
}	

// [ isCP ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le code postal à tester ( sur 5 caracteres )
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider un code postal

function isCP( p_strCP ) 
{
	var i = 0;
	
	p_strCP = p_strCP.toUpperCase( );
	
	if( p_strCP.length != 5 )
	{
		return false;
	}
	
	for ( i = 0 ; i < p_strCP.length ; i++ )
	{	
		if ( !( ( p_strCP.charAt( i ) >= '0' && p_strCP.charAt( i ) <= '9') || ( i == 1 && ( p_strCP.charAt( i ) == 'A' || p_strCP.charAt( i ) == 'B' ) ) ) )	
		{	
			return false;	
		}	
	}
	return true;	
}	
	

// [ isDepartement ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le deparement à tester ( sur 2 caracteres )
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider un departement

function isDepartement( p_strDep ) 
{

	p_strDep = p_strDep.toUpperCase( );
	
	if ( p_strDep.length != 2 )
	{
		return false;
	}
	if ( p_strDep == '20' || p_strDep == '96' || p_strDep == '97' || p_strDep == '98' || p_strDep == '99')
	{
		return false;
	}
	if ( ( ( p_strDep.charAt( 0 ) >= '0' && p_strDep.charAt( 0 ) <= '9' ) && 
	       ( p_strDep.charAt( 1 ) >= '0' && p_strDep.charAt( 1 ) <= '9' ) ) || p_strDep == '2A' || p_strDep == '2B' )
	{
		return true;
	}
	
	return false;	
}	

	
// [ isFileExtension ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le nom du fichier
//			soit une chaine contenant une extension, soit un tableau de chaines contenant les extentions
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de valider l'extension d'un fichier

function isFileExtension( p_strFileName, p_aExtendions )
{
	var i = 0;
	var strFileExtension = "";
	
	if ( p_strFileName == "" )
	{	
		return false;
	}
	if ( p_strFileName.lastIndexOf( "." ) < 0 )
	{
		return false;
	}

	strFileExtension = p_strFileName.substring( p_strFileName.lastIndexOf( "." ) + 1, p_strFileName.length );
	strFileExtension = strFileExtension.toUpperCase( );
	if ( typeof p_aExtendions == "string" ) p_aExtendions = Array( p_aExtendions );
	
	for ( i = 0 ; i < p_aExtendions.length ; i++ )
	{
		if ( strFileExtension == p_aExtendions[ i ].toUpperCase( ) )
		{
			return true;
		}
	}
	return false;
}


// [ isLikeCP ] ------------------------------------------------------------

//	Entrées :	la chaine contenant le code postal
//	Sortie :	Etat du test
// 	Description :	Fonction qui permet de savoir si la chaine envoyé ressemble à un code postal, cad commence bien par un departement suivi d'un nombre

function isLikeCP( p_strCP ) 
{
	var i = 0;

	p_strCP = p_strCP.toUpperCase( );
	
	for ( i = 0 ; i < p_strCP.length ; i++ )	
	{	
		if( !( ( p_strCP.charAt( i ) >= '0' && p_strCP.charAt( i ) <= '9' ) 
			|| ( i == 1 && ( p_strCP.charAt( i ) == 'A' || p_strCP.charAt( i ) == 'B') ) ) )	
		{	
			return false;	
		}	
	}
	
	return true;
}	
