var definition = null;

function champ_lire_valeur( objet )
{
	// --------------
	// initialisation
	// --------------
	var liste_elements = null;


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre objet
	if( objet == null )
		// null : impossible de lire la valeur
		return null;


	// -----------
	// traitements
	// -----------
	if( objet.tagName == "SELECT" )
		{
		if( objet.selectedIndex >= 0 )
			return objet.options[objet.selectedIndex].value;
		return '';
		}

	if( ( objet.tagName == "TEXTAREA" )
		|| ( objet.type == "text" )
		|| ( objet.type == "password" )
		|| ( objet.type == "hidden" )
		|| ( objet.type == "file" )
		|| ( objet.type == "button" )
		)
		return objet.value;

	if( ( objet.type == "radio" ) || ( objet.type == "checkbox" ) )
		{
		liste_elements = getElementsByAttribute( "name", objet.name );
		for( num_element=0 ; num_element<liste_elements.length ; num_element++ )
			if( liste_elements[num_element].checked )
				return liste_elements[num_element].value;
		return '';
		}


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// null : impossible de lire la valeur
	return null;
}

function verifier_valeur( valeur, definition )
{
	switch( definition['nom_type'] )
		{
		case 'email':
			return valeur.match( /^[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+.[a-zA-Z]+$/gi );
			break;
		}
	
	if( ( definition['autorise'] != null ) && ( definition['autorise'] != '' ) )
		for( var i=0 ; i<valeur.length ; i++ )
			if( definition['autorise'].indexOf( valeur.substr( i, 1 ) ) == -1 )
				return false;

	return true;
}

function trouver_bloc( objet )
{
	return objet.parentNode.parentNode;
}


function champ_lire_valeur_groupe( nom_champ )
{
	var valeur = new Array();

	if( definition[nom_champ]['groupe'] == 'oui' )
		{
		$A( document.getElementsByName( nom_champ + "[]" ) ).each(function(item)
			{
			if( item.checked )
				valeur[valeur.length] = item.value;
			});
		}
	else
		valeur[0] = champ_lire_valeur( document.getElementsByName( nom_champ ).item(0) );
	return valeur;
}

function verifier_liaison( valeur, possible )
{
	var retour = -1;
	$A( possible ).each(function(item)
		{
		if( $A( valeur ).indexOf( item ) != -1 )
			retour = 0;
		});
	return retour;
}

function valider_le_formulaire( mon_form, mode )
{
	var erreur = false;
	var ma_definition = null;
	var valeur = null;
	var item = null;
	var ma_definition = null;

//debug( '' );
//document.getElementById( "debug" ).innerText = 'valider_le_formulaire : ';

	for( var nom_champ in definition )
		{
		if( mode == true )
			definition[nom_champ]['modifie'] = true;
		ma_definition = definition[nom_champ];
		if( ma_definition['modifie'] )
			{
			if( ma_definition['groupe'] == 'oui' )
				item = document.getElementsByName( nom_champ + "[]" ).item(0);
			else
				item = document.getElementsByName( nom_champ ).item(0);

			Element.removeClassName( trouver_bloc( item ), 'champ_en_erreur' );
			if( ma_definition['est_obligatoire'] == 'oui' )
				Element.addClassName( trouver_bloc( item ), 'champ_ok' );

			if( typeof( ma_definition['avec_confirmation'] ) != 'undefined' )
				{
				Element.removeClassName( trouver_bloc( document.getElementsByName( 'confirmer_' + nom_champ ).item(0) ), 'champ_en_erreur' ) ;
				if( ma_definition['est_obligatoire'] == 'oui' )
					Element.addClassName( trouver_bloc( document.getElementsByName( 'confirmer_' + nom_champ ).item(0) ), 'champ_ok' );
				}
			}
		}

	for( var nom_champ in definition )
		{
		ma_definition = definition[nom_champ];
		if( ( mode == true ) || ( ma_definition['modifie'] ) )
			{
			valeur = new Array();
			if( ma_definition['groupe'] == 'oui' )
				{
				item = document.getElementsByName( nom_champ + "[]" ).item(0);
				valeur = champ_lire_valeur_groupe( nom_champ );
				}
			else
				{
				item = document.getElementsByName( nom_champ ).item(0);
				if( champ_lire_valeur( item ) != '' )
					valeur[0] = champ_lire_valeur( item );
				}

			if( 
				// vérifier s il est obligatoire (est_obligatoire)
				( ( ma_definition['est_obligatoire'] == 'oui' ) && ( valeur.length == 0 ) )

				// vérifier son type (nom_type)
				|| ( ( typeof( ma_definition['nom_type'] ) != 'undefined' ) && ( valeur.length != 0 ) && ( !verifier_valeur( valeur[0], ma_definition ) ) )

				// vérifier son minimum (taille_min)
				|| ( ( typeof( ma_definition['taille_min'] ) != 'undefined' ) && ( ( valeur.length == 0 ) || ( valeur[0].length < ma_definition['taille_min'] ) ) )

				// vérifier sa liaison (lie_a)
/*
				|| ( ( typeof( ma_definition['lie_a'] ) != 'undefined' ) && ( valeur.length > 0 ) &&
						( $A( champ_lire_valeur_groupe( ma_definition['lie_a']['nom_champ'] ) ).indexOf( ma_definition['lie_a']['valeur'] ) == -1 ) )
				|| ( ( typeof( ma_definition['lie_a'] ) != 'undefined' ) && ( valeur.length == 0 ) &&
						( $A( champ_lire_valeur_groupe( ma_definition['lie_a']['nom_champ'] ) ).indexOf( ma_definition['lie_a']['valeur'] ) != -1 ) )
*/
				|| ( ( typeof( ma_definition['lie_a'] ) != 'undefined' ) && ( valeur.length > 0 ) &&
						(
						verifier_liaison( champ_lire_valeur_groupe( ma_definition['lie_a']['nom_champ'] ), ma_definition['lie_a']['valeur'] ) 
						== -1 ) )
				|| ( ( typeof( ma_definition['lie_a'] ) != 'undefined' ) && ( valeur.length == 0 ) &&
						(
						verifier_liaison( champ_lire_valeur_groupe( ma_definition['lie_a']['nom_champ'] ), ma_definition['lie_a']['valeur'] ) 
						!= -1 ) )
			)
				{
				erreur = true;
				Element.addClassName( trouver_bloc( item ), 'champ_en_erreur' );
				}

			// vérifier sa confirmation (avec_confirmation)
			if( typeof( ma_definition['avec_confirmation'] ) != 'undefined' )
				{
				var confirmer_item = document.getElementsByName( 'confirmer_' + nom_champ ).item(0);
				if( champ_lire_valeur( confirmer_item ) != valeur )
					{
					// mettre le champ de confirmation en erreur
					Element.addClassName( trouver_bloc( confirmer_item ), 'champ_en_erreur' );
					erreur = true;
					}
				}
			}
		}

	return !erreur;
}


function maj_champ_simple( item )
{
	if( ( !definition[item.name]['modifie'] ) && ( champ_lire_valeur( item ) != '' ) )
		definition[item.name]['modifie'] = true;
	valider_le_formulaire( item.form, false );
}


function maj_champ_confirmation( item )
{
	nom_champ = item.name.substr( 10, item.name.length-2 );
	if( ( !definition[nom_champ]['modifie'] ) && ( champ_lire_valeur( item ) != '' ) )
		definition[nom_champ]['modifie'] = true;
	valider_le_formulaire( item.form, false );
}


function maj_champ_groupe( item )
{
	nom_champ = item.name.substr( 0, item.name.length-2 );
	if( !definition[nom_champ]['modifie'] )
		{
		$A( document.getElementsByName( item.name ) ).each(function(item)
			{
			if( item.checked )
				definition[nom_champ]['modifie'] = true;
			});
		}
	valider_le_formulaire( item.form, false );
}


function initialiser_formulaire( mon_form, donnees, mes_definitions )
{
	definition = mes_definitions;
	for( nom_champ in definition )
		{
		if( definition[nom_champ]['groupe'] != 'oui' )
			{
			liste = document.getElementsByName( nom_champ );
			if( ( typeof( donnees[nom_champ] ) != 'undefined' ) && ( donnees[nom_champ] != null ) )
				{
				champ_ecrire_valeur( liste.item(0), donnees[nom_champ] );
				definition[nom_champ]['modifie'] = true;
				}
			$A( liste ).each(function(item)
				{
				Event.observe( item, 'click', function(){ maj_champ_simple( this ) } );
				Event.observe( item, 'change', function(){ maj_champ_simple( this ) } );
				Event.observe( item, 'keyup', function(){ maj_champ_simple( this ) } );
				});
			if( definition[nom_champ]['avec_confirmation'] == 'oui' )
				{
				confirmer_item = document.getElementsByName( 'confirmer_' + nom_champ ).item(0);
				if( typeof( donnees['confirmer_' + nom_champ] ) != 'undefined' )
					champ_ecrire_valeur( confirmer_item, donnees['confirmer_' + nom_champ] );
				Event.observe( confirmer_item, 'change', function(){ maj_champ_confirmation( this ) } );
				Event.observe( confirmer_item, 'keyup', function(){ maj_champ_confirmation( this ) } );
				}
			}
		else
			{
			$A( document.getElementsByName( nom_champ + '[]' ) ).each(function(item)
				{
				if( typeof( donnees[nom_champ] ) != 'undefined' )
					{
					if( $A( donnees[nom_champ] ).indexOf(item.value) != -1 )
						item.checked = true;
					definition[nom_champ]['modifie'] = true;
					}
				Event.observe( item, 'change', function(){ maj_champ_groupe( this, mon_form ) } );
				Event.observe( item, 'keyup', function(){ maj_champ_groupe( this, mon_form ) } );
				});
			}
		}
	valider_le_formulaire( mon_form, false );
}

function aller_a_l_etape( etape_voulue, id_produit, etape_courante )
{
	if( ( etape_courante == 'resume' )
		|| ( valider_le_formulaire( $( 'mon_form' ), true ) ) )
		{
		if( etape_courante == 'resume' )
			$( 'etape_courante' ).value = '';
		$( 'etape_suivante' ).value = etape_voulue;
		$( 'id_produit_suivant' ).value = id_produit;
		$( 'mon_form' ).submit();
		}
}
