/* 	Permet de créer 2 listes dépendante, les valeurs dans la seconde liste sont mises à jour en
	fonction de la valeur sélectionnée dans la première liste	
	@param string bound_select_name : attribtut name de la liste dépendante
	@param string bound_to_select_name : nom de la liste dont on dépend
	@param Array data_array	
		2 solutions pour le tableau de données :
		1.On fourni un tableau de données qui a la structure suivante (data_array[0][cle]	= 'valeur';)
			clé 1 : value des options de la liste 2 
			clé 2 : texte des options de la liste 2
			clé 3 : même nom que la liste 1
		2. Le tableau de données a une structure sans rapport avec ce qui précède 
		et on va fournir un paramètre data_fields qui fournira les noms des champs :
		data_fields ('champ id liste 2', 'champ texte liste 2', 'champ id liste 1')
	@param Array data_fields, [optionnel] nom des champs
	
	exemple :
	bind_selects('region', 'pays', tab_regions, new Array('id', 'text','code_pays'));
	bind_selects('ville', 'region', tab_villes, new Array('id', 'text','code_region'));
*/
var bind_params = new Array();


function bind_selects(bound_select_name, bound_to_select_name, data_array, data_fields){
	/* vérifie que les listes existent */
	if (document.getElementsByName(bound_select_name).length == 0 || document.getElementsByName(bound_select_name)[0].nodeName.toLowerCase() != 'select') {
		alert('fonction bind_selects, la liste "' + bound_select_name + '" est introuvable');
	}
	
	if (document.getElementsByName(bound_to_select_name).length == 0 || document.getElementsByName(bound_to_select_name)[0].nodeName.toLowerCase() != 'select') {
		alert('fonction bind_selects, la liste "' + bound_to_select_name + '" est introuvable');
	}
	
	var i			= 0;
	var tab_cles	= new Array(); 
	for (cle in data_array[0]) {
		tab_cles[i]	= cle;			
		i++;
	}
	
	/* le tableau doit comporter au moins 3 clés sur chaque ligne */
	if (tab_cles.length < 3) {
		alert('bind_selects ('+bound_select_name+') : le tableau de données doit comporter au moins 3 clés id, text, valeur de liaison ');
	}

	if (typeof(data_fields) == 'object' && data_fields.length == 3) {
		/* détermine si les noms de champs fournis peuvent être trouvés dans le tableau de données */
		for (i = 0; i < 3; i++) {
			if (tab_cles.indexOf(data_fields[i]) === -1) {
				alert('clé N° ' + (i + 1) + ' introuvable : ' + data_fields[0]);
			}
		}
	} else {
		/* cas où  le tableau de données a une structure (id liste 2, texte liste 2,  id liste 1)
		détermine si dans on trouve une clé bound_to_select_name (correspondant à l'id de la liste 1) 
		en 3e position dans le tableau de données */
		if (tab_cles[2] == bound_to_select_name) {
			data_fields[0]	= tab_cles[0];	
			data_fields[1]	= tab_cles[1];	
			data_fields[2]	= tab_cles[2];	
		} else {
			alert('bind_selects (' + bound_select_name + ') : le tableau de données fourni doit comporter un index associatif "' + bound_to_select_name + '" en 3e position');
			return false;	
		}		
	}
	
	/* sauvegarde les paramètres dans une variable globale pour pouvoir gérer plusieurs liaisons */
	bind_params[bound_select_name]					= new Array();
	bind_params[bound_select_name]['data_array']	= data_array;
	bind_params[bound_select_name]['data_fields']	= data_fields;
		
	/* init */
		
	
	
	
	document.getElementsByName(bound_to_select_name)[0].onchange = function (){
		fill_bound_select(bound_select_name, bind_params[bound_select_name]['data_array'], this[this.selectedIndex].value, bind_params[bound_select_name]['data_fields']);
	}
	
}

function fill_bound_select(select_name, data_array, link_key_value, data_fields){
	if (document.getElementsByName(select_name).length ==0) {
		alert('fill_bound_select liste "' + select_name + '" introuvable');
	}
	
	bound_select	= document.getElementsByName(select_name)[0];
	selected_value	= bound_select.length > 0 ? bound_select[bound_select.selectedIndex].value : null;
	
	if (!(typeof(data_fields) == 'object' && data_fields.length >= 3)) {
		alert('les noms des champs de données ne permettent pas de lier la liste');
	}	
	
	bound_select.length = 0;
	/* parcours le tableau de données pour peupler la liste */
	nb = data_array.length;
	
	bound_select[0] = new Option('', 0);
	var j = 1;
	for (i = 0; i < nb; i++) {
		if (data_array[i][data_fields[2]] == link_key_value) {
			bound_select[j] = new Option(data_array[i][data_fields[1]], data_array[i][data_fields[0]]);	
			j++;		
		}
	}
	send_event(bound_select, 'change');
}

function send_event(target, event_name){
	if ((navigator.appName.indexOf('Microsoft') >= 0)) {
		target.fireEvent(event_name);
	} else {
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event_name, true, false);
		target.dispatchEvent(evt);
	}
}
