/**
 * Module ajax pour charger des listes
 *	Ce script necessite des variables déclarées
 *		- ajax_div_liste geoloc_div_liste_villes : le nom du calque qui contiendra le resultat de la recherche
 *		- ajax_champ : le champ dans lequel on enverra la valeur finale (autre que le champ random)
 *		- ajax_script : Le script qui sera appelé
 *		- ajax_parameters : Tableau associatif des differents parametres POST
 *			# si "field_name" est renseigné on prendra cette valeur à envoyer sinon on prend "post_value"
 *				array(
 *					0 => array(
 *						'post_name' => <nom de la variable post>,
 *						'post_value' => <valeur de la variable en post>,
 *						'field_name' => <nom du champ dans lequel on va chercher la valeur à envoyer en post>
 *					),
 *					N => array(
 *						'post_name' => <nom de la variable post>,
 *						'post_value' => <valeur de la variable en post>,
 *						'field_name' => <nom du champ dans lequel on va chercher la valeur à envoyer en post>
 *					),
 *				)
 *		
 *	exemple de déclaration des variables :
 *	<script type="text/javascript">
 *		var ajax_div_liste = 'div_ajax_content';
 *		var ajax_champ = 'localisations[valeur]';
 *		var ajax_script = 'xml_villes.php';
 *		var ajax_param1 = new Array; ajax_param1["post_name"] = ""; ajax_param1["post_value"] = ""; ajax_param1["field_name"] = "";
 *		var ajax_param2 = new Array; ajax_param2["post_name"] = ""; ajax_param2["post_value"] = ""; ajax_param2["field_name"] = "";
 *		var ajax_paramN = new Array; ajax_paramN["post_name"] = ""; ajax_paramN["post_value"] = ""; ajax_paramN["field_name"] = "";
 *		var ajax_parameters = new Array(ajax_param1, ajax_param2, ajax_paramN);
 *	</script>
 *
 *	Avant de valider le formulaire de la page, il faut tester si le formulaire est "submitable"
 * 	avec la fonction "ajax_is_form_submited", pour savoir si lorsque l'on a pressé la touche entrer,
 *	c'etait pour choisir dans la liste ou pour valider le formulaire
 *
 * @author : Service Informatique
 * @version : 2007-09-25
 * @copyright : Monné-Decroix (service informatique)
 */
 
// Config
var ajax_active = 0;
var ajax_active_value = '';
var ajax_enter_key = '';

/**
 * Fonction qui demande un XML en fonction d'un texte tapée
 *
 * @param object objTexte Objet correspondant au champ du texte
 * @param event keyCode Evenement correspodant à une touche
 * @param string randomName Nom du champ random
 */
function ajax(objTexte, keyCode, randomName, method){
	if(method == undefined){
		method = 'POST';
    }
    
    var xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    //on met à jour le champs ajax (copie du champs random)
    document.getElementById(ajax_champ).value=document.getElementById(randomName).value;
    
    //on définit l'appel de la fonction au retour serveur
    xhr.onreadystatechange = function() {
    	alert_ajax(xhr, keyCode, randomName);
    };
   
	// On ajoute les parametres en plus
	var str_parameters = '';
	if(typeof(ajax_parameters) != 'undefined'){
		for(var i = 0; i < ajax_parameters.length; i++){
			if(ajax_parameters[i]['field_name'] != ''){
				str_parameters += ajax_parameters[i]['post_name']+'='+addslashes(document.getElementById(ajax_parameters[i]['field_name']).value)+'&';
			} else {
				str_parameters += ajax_parameters[i]['post_name']+'='+addslashes(ajax_parameters[i]['post_value'])+'&';
			}
		}
	}
   
    if(method == "POST"){
    	// On lance la requete
		xhr.open('GET', 'scripts/php/'+ajax_script, true);
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xhr.send('str='+noaccent(addslashes(objTexte.value))+'&'+str_parameters);
	} else {
		xhr.open('GET', 'scripts/php/'+ajax_script+'?str='+noaccent(addslashes(objTexte.value))+'&'+str_parameters, true);
		xhr.send(null);
	}
}

/**
 * Fonction qui affiche les resultats du XML
 *
 * @param object xhr Objet correspondant a la reponse du xml_http_request
 * @param event keyCode Evenement correspodant à une touche
 * @param string randomName Nom du champ random
 */
function alert_ajax(xhr, keyCode, randomName){
	if (xhr.readyState==4){
    	var docXML = xhr.responseXML;
    	var loc_geo_active;
    	var active = false;
    	var items = docXML.getElementsByTagName('donnee');
    	//on fait juste une boucle sur chaque element "donnee" trouvé
    	
    	// On cache le calque de la liste des villes
    	clear_html();
    	
    	// On affiche le calque de la liste des villes
    	document.getElementById(ajax_div_liste).style.display = 'block';
	    
	    // Si on appuie sur les touches 'fleche haut' ou 'fleche bas'
	    //	On sauvegarde la valeur dans le champ actif
		if (keyCode == 40 || keyCode == 38){
			loc_geo_active = ajax_active;
		}
      
      	var content_div = '';
		for (i = 0; i < items.length; i++){
			var li_class = 'liste_ajax';
    	  
			if (i==0){
				li_class = 'liste_ajax_top';
				// Desactivé pour que l'on puisse garder ce que l'on a saisi dans le champ sans prendre
				//	automatiquement la première entrée trouvée
				//document.getElementById(ajax_champ).value = trim(items.item(i).firstChild.data);
			}
			if (i==(items.length-1)){
				li_class = "liste_ajax_bottom";
			}
			if ((items.length-1)==0){
				li_class = "liste_ajax_both";
			}
			        
			/*Gestion du défilement haut et bas de la liste*/
        
			// Touche du bas
			if (keyCode==40 && (loc_geo_active==i || i==items.length-1) && active==false){
				if (loc_geo_active==(items.length-1) || loc_geo_active==items.length) {
					loc_geo_active = ajax_active=items.length;
				} else {
					loc_geo_active = ajax_active=(i+1);
				}
				li_class = li_class+" liste_ajax_active";
				active=true;
				ajax_active_value=trim(items.item(i).firstChild.data);
			}
			// Touche du haut
			else if (keyCode==38 && (loc_geo_active-2==i || loc_geo_active==1) && active==false){
				if (i==0){
					loc_geo_active = ajax_active=1;
				} else {
					loc_geo_active = ajax_active=(i+1);
				}
				li_class = li_class+" liste_ajax_active";
				active=true;
				ajax_active_value=trim(items.item(i).firstChild.data);
			// Autre touche
			} else if (keyCode!=38 && keyCode!=40){
				loc_geo_active=ajax_active=0;
			}
        
			content_div += '<li class="'+li_class+'" onclick="javascript:ajax_to_html(\''+addslashes(trim(items.item(i).firstChild.data))+'\',\''+randomName+'\');">'+items.item(i).firstChild.data+'</li>';
		}
		
		if(content_div != ''){
			content_div = '<ul>'+content_div+'</ul>';
		}
		document.getElementById(ajax_div_liste).innerHTML = content_div;
	}
    
    // Touche echap
	if (keyCode==27) {
		clear_html();
	}
}

/**
 * Fonction qui permet de selectionner un elements de la liste des villes avec la touche entrée
 *
 * @param event keyCode Evenement correspodant à une touche
 * @param string randomName Nom du champ random
 */
function set_active(keyCode, randomName){
	if(keyCode==13){
		if (ajax_active!=0){
			document.getElementById(ajax_champ).value=ajax_active_value;
			document.getElementById(randomName).value=ajax_active_value;
			ajax_enter_key="ok";
			ajax_active=0;
		} else {
			ajax_enter_key="nok";
		}
	}
}

/**
 * Fonction qui remplie le champs texte suite à la selection
 *
 * @param string texte Le texte a mettre dana le champ random
 * @param string randomName Nom du champ random
 */
function ajax_to_html(texte, randomName){
	document.getElementById(randomName).value = texte;
	document.getElementById(ajax_champ).value = texte;
	document.getElementById(randomName).focus();
	
	clear_html();
}

/**
 * Fonction qui fait disparaitre la liste des villes proposées
 */
function clear_html(){
	document.getElementById(ajax_div_liste).innerHTML = "";
}

/**
 * Fonction permettant de savoir si au moment de l appuie sur la touche entrée, la liste des ville est active
 *
 * @param string randomName Nom du champ random
 * @return boolean
 */
function ajax_is_form_submited(randomName){
	if (ajax_enter_key=="ok"){
		ajax_enter_key="nok";
		ajax_active=0;
		document.getElementById(randomName).focus();
		return false;
	} else {
		return true;
    }
}


