var listeIDCategorieDroitsDAuteur = new Array();

var chemin			= new Array();
var indexSelection	= new Array();

var resultat		= '';
var http_request	= '';

// Permet de conserver la valeur du champ
// malgré les manipulations AJAX
var input_zonelibre = '';
var input_lieulibre = '';
var active_focus = false;


Array.prototype.inArray = function (value){
    for (var i = 0; i < this.length; i++) {
        // identique (===), similaire (==)
        if (this[i] === value) {
            return true;
        }
    }
    return false;
};


// Fonction d'envoi des requete
function envoieRequete(url, requete) {
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			try {
				http_request = new ActiveXObject('Microsoft.XMLHTTP');
			} catch (e) {
			}
		}
	}

	if (!http_request) {
		window.alert('Erreur : Impossible de créer une instance de XMLHttpRequest.');
		return false;
	}

	http_request.open('POST', url, false);
	http_request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	http_request.send(requete);

	if (http_request.status == 200) {
   	  	return true;
	} else {
		return false;
	}
}


// Fonction utilisée avant les join et après les split
// pour enlever les chaines vides du tableau ou les éléments indéfinis.
// Si on trouve un élément vide, on le supprime avec tous ceux qui suivent.
// Retourne un tableau "propre".
function tableauSupprimeElementVide(tableau) {
	if (!tableau instanceof Array) {
		return null;
	}

	var resultat = tableau;
	var i = 0;
	while (i < resultat.length) {
		switch (typeof(resultat[i])) {
			case 'string':
				if (resultat[i].length) {
					i++;
					break;
				}

			case 'undefined':
				resultat.splice(i, (resultat.length - i));
				break;

			default:
				i++;
		}
	}

	return resultat;
}


// En cas de retour sur le formulaire, récupération des chaines
function reInitSelection() {
	var cheminCourant;
	var selectionCourante;
	var niveau;

	try {
		cheminCourant	= document.getElementsByName('f_chemin_categorie');
		selectionCourante	= document.getElementsByName('f_selection_categorie');

		if (cheminCourant.length) {
			cheminCourant = cheminCourant[0].value;
		} else {
			cheminCourant = '';
		}

		if (selectionCourante.length) {
			selectionCourante = selectionCourante[0].value;
		} else {
			selectionCourante = '';
		}
	} catch (e) {
	}


	if (cheminCourant.length) {
		// désérialise les chaines
		chemin = cheminCourant.split(',');
		indexSelection = selectionCourante.split(',');

		niveau = chemin.length;

		var listeCategorie = document.getElementById('f_id_categorie_' + niveau);

		rechargeListeCategorie('/cgi/recherche/recherche_categorie.nostat.php', listeCategorie, niveau);
	}
}


function onSousCategorieLoad() {
	var niveauCourant = chemin.length - 1;
	var niveau = 0;
	var last, select;

	while ((last = document.getElementById('f_id_categorie_' + (niveau + 1)))) {
		select = last;
		niveau++;
	}

	if (!select || select.selectedIndex || !select.options[select.selectedIndex].value.length) {
		return false;
	}

	if (niveau <= niveauCourant) {
		return false;
	}

	select.onchange();

	return true;
}


// Enregistre les catégories sélectionnées et va chercher les listes correspondantes
function rechargeListeCategorie(url, liste, niveau) {
	var index_courant;
	var valeur_courante;
	var f_id_categorie;
	var f_chemin_categorie;
	var f_selection_categorie;

	f_id_categorie = document.getElementsByName('f_id_categorie');
	if (f_id_categorie.length) {
		f_id_categorie = f_id_categorie[0];
	} else {
		f_id_categorie = '';
	}

	f_chemin_categorie = document.getElementsByName('f_chemin_categorie');
	if (f_chemin_categorie.length) {
		f_chemin_categorie = f_chemin_categorie[0];
	} else {
		f_chemin_categorie = null;
	}

	f_selection_categorie = document.getElementsByName('f_selection_categorie');
	if (f_selection_categorie.length) {
		f_selection_categorie = f_selection_categorie[0];
	} else {
		f_selection_categorie = null;
	}

	if (liste) {
		index_courant	= liste.selectedIndex;
		valeur_courante	= Number(liste.options[index_courant].value);

		// choix d'une categorie vide, on remonte d'un niveau
	 	if (isNaN(valeur_courante)) {
	 		niveau--;
	 	} else {
			// Sauvegarde dans le formulaire
			chemin[niveau]		= valeur_courante.toString();
			indexSelection[niveau]	= index_courant.toString();
		}

	 	f_id_categorie.value = chemin[niveau];
	}

	// On supprime toutes les catégories filles de la catégorie
	// qui vient d'être modifiée (si elles existent).
	if (niveau < chemin.length - 1) {
		// Méthode splice(i, n):
		// Supprime n éléments à partir de l'élément i.
		var i = niveau + 1;
		var n = chemin.length - i;
		chemin.splice(i, n);
		indexSelection.splice(i, n);
	}

	// "sérialisation" du tableau
	var leChemin = chemin.join(',');
	var lesSelections = indexSelection.join(',');

	// Sauvegarde des éléments sérialisés
	f_chemin_categorie.value = leChemin;
	f_selection_categorie.value = lesSelections;

	var corps  = 'f_id_categorie_mere=' + valeur_courante + '&f_niveau_cartegorie=' + niveau + '&f_chemin=' + leChemin;

	if (envoieRequete(url, corps)) {
		resultat = http_request.responseText;

		var ligneSousCategorie	= document.getElementById('ligne_sous_categorie');
		var sousCategorie		= document.getElementById('sous_categorie');

		if (resultat) {
			ligneSousCategorie.style.display = '';
			sousCategorie.style.display = '';
			sousCategorie.innerHTML = resultat;
			onSousCategorieLoad();
		} else {
			// pas de categ
			ligneSousCategorie.style.display = 'none';
			sousCategorie.style.display = 'none';
			sousCategorie.innerHTML = '';
		}
	} else {
		alert('There was a problem with the request.');
	}

	reSelectCategorie();
}


// Resélectionne les valeurs choisies
function reSelectCategorie() {
	var i;
	var f_id_categorie_i = document.getElementById('f_id_categorie_0');

	// Gestion de la disparition (clique sur le selecteur) ou de la
	// réappartion (rechargement de la page) de l'Option "Choisir"...
	// Sans ça, la reselection risque de donner n'importe quoi.
	if (indexSelection.length
		&& chemin.length
		&& f_id_categorie_i
		&& f_id_categorie_i.options.length
		&& f_id_categorie_i.options[indexSelection[0]].value != chemin[0]) {
		for (i = 0; i < f_id_categorie_i.options.length; i++) {
			if (f_id_categorie_i.options[i].value == chemin[0]) {
				indexSelection[0] = i;
				break;
			}
		}
	}

	for (i = 0; i < indexSelection.length; i++) {
		f_id_categorie_i = document.getElementById('f_id_categorie_' + i);
		if (f_id_categorie_i) {
			f_id_categorie_i.selectedIndex = indexSelection[i];
		}
	}

	// Changement de la mention droits d'auteur en fonciton de la catégorie
	var auteur		= document.getElementById('mention_auteur');
	var droitsAuteur	= document.getElementById('mention_droits_auteur');
	if (auteur && droitsAuteur) {
		if (listeIDCategorieDroitsDAuteur.inArray(chemin[chemin.length - 1])) {
			auteur.style.display		= 'none';
			droitsAuteur.style.display	= '';
		} else {
			auteur.style.display		= '';
			droitsAuteur.style.display	= 'none';
		}
	}
}


function masqueZone(){
	try {
		if ( document.getElementById('ligne_zone_geographique') )
			document.getElementById('ligne_zone_geographique').style.display = 'none';
			
		if ( document.getElementById('zone_geographique') )
			document.getElementById('zone_geographique').style.display = 'none';
			
		var f_id_zonegeographique	= document.getElementsByName('f_id_zonegeographique');
		var f_libelle_zonelibre		= document.getElementsByName('f_libelle_zonelibre');
		var f_id_zonelibre		= document.getElementsByName('f_id_zonelibre');
		f_id_zonegeographique[0].value = '';
		f_libelle_zonelibre[0].value = '';
		f_id_zonelibre[0].value = '';
	} catch(e) {
	}
}


function afficheZone() {
	if ( document.getElementById('ligne_zone_geographique') )
		document.getElementById('ligne_zone_geographique').style.display = '';
		
	if ( document.getElementById('zone_geographique') )
		document.getElementById('zone_geographique').style.display = '';
}


function masqueLieu(){
	try {
		if ( document.getElementById('ligne_lieu_geographique') )
			document.getElementById('ligne_lieu_geographique').style.display = 'none';
			
		if ( document.getElementById('lieu_geographique') )
			document.getElementById('lieu_geographique').style.display = 'none';
			
		var f_id_lieugeographique	= document.getElementsByName('f_id_lieugeographique');
		var f_libelle_lieulibre		= document.getElementsByName('f_libelle_lieulibre');
		var f_id_lieulibre		= document.getElementsByName('f_id_lieulibre');
		f_id_lieugeographique[0].value = '';
		f_libelle_lieulibre[0].value = '';
		f_id_lieulibre[0].value = '';
	} catch(e) {
	}
}


function masqueVille(){
	try {
		if ( document.getElementById('ligne_ville') )
			document.getElementById('ligne_ville').style.display = 'none';
			
		var f_id_ville			= document.getElementsByName('f_id_ville');
		var f_id_villelibre		= document.getElementsByName('f_id_villelibre');
		var f_libelle_villelibre	= document.getElementsByName('f_libelle_villelibre');
		f_id_ville[0].value= '';
		f_id_villelibre[0].value= '';
		f_libelle_villelibre[0].value= '';

		var f_id_lieugeographique	= document.getElementsByName('f_id_lieugeographique');
		var f_libelle_lieulibre		= document.getElementsByName('f_libelle_lieulibre');
		var f_id_lieulibre		= document.getElementsByName('f_id_lieulibre');
		f_id_lieugeographique[0].value = '';
		f_libelle_lieulibre[0].value = '';
		f_id_lieulibre[0].value = '';
	} catch(e) {
	}
}


function afficheVille() {
	if ( document.getElementById('ligne_ville') )
		document.getElementById('ligne_ville').style.display = '';
}


// Active / Désactive la liste des zones géographiques
// Reset les listes et variables
function actionPaysSelectionne() {
	var index_courant;
	var id_pays_selectionne;
	var id_zone_selectionne;

	try {
		index_courant		= document.getElementById('f_id_pays').selectedIndex;
		id_pays_selectionne	= document.getElementById('f_id_pays').options[index_courant].value;
		id_zone_selectionne	= document.getElementsByName('f_id_zonegeographique');

		id_zone_selectionne	= id_zone_selectionne.length ? id_zone_selectionne[0].value : null;
  	} catch (e) {
  	}


	// Récupération de la liste de zones (sauf si on sélectionne le choix vide)
	if (id_pays_selectionne != null && id_pays_selectionne != '') {
		// Récupération de la liste des zones
		var url = '/cgi/recherche/recherche_ensemble.nostat.php?';
		var corps  = 'f_flag_type=1&f_id_pays=' + id_pays_selectionne;
		if (id_zone_selectionne) {
			// Permet de préselectionner la zone dans la liste
			corps += '&f_id_ensemble=' + id_zone_selectionne;
		}

		if (envoieRequete(url, corps)) {
			resultat = http_request.responseText;

			// Sauvegarde de la valeur de l'"input"
			input_zonelibre = document.getElementById('zone_geographique_saisie').value;

			// Si aucune zone n'est sélectionnée on affiche l'input de renseignement de la zone libre
			if (resultat != null && resultat != '') {
				// On affiche la boite de sélection
				document.getElementById('ligne_zone_geographique').style.display = '';
				document.getElementById('zone_geographique').style.display = '';
				document.getElementById('zone_geographique').innerHTML = resultat;

				// On masque la zone de saisie libre si id_zone_selectionne != -1
				if (id_zone_selectionne == '-1') {
					document.getElementById('zone_geographique_saisie').style.display = '';
				} else {
					document.getElementById('zone_geographique_saisie').style.display = 'none';
				}
//				document.getElementById('zone_geographique_saisie').value = input_zonelibre;
			} else {
				// On masque la boite de sélection
				document.getElementById('zone_geographique').innerHTML = '';

				// On affiche la zone de saisie libre
				document.getElementById('ligne_zone_geographique').style.display = '';
				document.getElementById('zone_geographique_saisie').style.display = '';
				id_zone_selectionne = -1;
//				document.getElementById('zone_geographique_saisie').value = input_zonelibre;
			}
		}  else {
			alert('There was a problem with the request.');
		}
	} else {
		// pas de pays sélectionné
		masqueZone();
		masqueLieu();
	}

	// on reset la ville
	try{
		document.getElementsByName('f_id_ville').value = '';
		document.getElementsByName('f_id_villelibre').value = '';
		document.getElementById('f_localisation_1').value = '';
		actionVilleSelectionne();
	} catch (e) {
	}
}


// Active / Désactive la liste des zones géographiques
// Reset les listes et variables
function actionVilleSelectionne() {
	var id_ville_selectionne = null;
	var id_villelibre_selectionne = null;
	var id_lieu_selectionne = null;
	var libelle_villelibre = null;

	try {
		var id_ville_selectionne	= document.getElementsByName('f_id_ville');
		var id_villelibre_selectionne	= document.getElementsByName('f_id_villelibre');
		var id_lieu_selectionne		= document.getElementsByName('f_id_lieugeographique');
		var libelle_villelibre		= document.getElementById('f_localisation_1');

		id_ville_selectionne		= id_ville_selectionne.length		? id_ville_selectionne[0].value		: null;
		id_villelibre_selectionne	= id_villelibre_selectionne.length	? id_villelibre_selectionne[0].value	: null;
		id_lieu_selectionne		= id_lieu_selectionne.length		? id_lieu_selectionne[0].value		: null;
		libelle_villelibre		= libelle_villelibre			? libelle_villelibre.value			: null;
	} catch(e) {
	}

	// Récupération de la liste de zones (sauf si on sélectionne le choix vide)
	if (id_ville_selectionne) {
		masqueZone();
		// Récupération de la liste des lieux
		url = '/cgi/recherche/recherche_ensemble.nostat.php?';
		corps = 'f_flag_type=6&f_id_ville=' + id_ville_selectionne;
		if (id_lieu_selectionne) {
			// Permet de préselectionner le lieu dans la liste
			corps += '&f_id_ensemble=' + id_lieu_selectionne;
		}

		if (envoieRequete(url, corps)) {
			resultat = http_request.responseText;

			// Sauvegarde de la valeur de l'"input"
			input_lieulibre = document.getElementById('ligne_lieu_geographique').value;

			// Si aucune zone n'est sélectionnée on affiche l'input de renseignement de la zone libre
			if (resultat != null && resultat != '') {
				// On affiche la boite de sélection
				document.getElementById('ligne_lieu_geographique').style.display = '';
				document.getElementById('lieu_geographique').style.display = '';
				document.getElementById('lieu_geographique').innerHTML = resultat;

				// On masque la zone de saisie libre si id_lieu_selectionne != -1
				if (id_lieu_selectionne == '-1') {
					document.getElementById('lieu_geographique_saisie').style.display = '';
					if (active_focus) {
						document.getElementById('f_libelle_lieulibre').focus();
					}
				} else {
					document.getElementById('lieu_geographique_saisie').style.display = 'none';
					if (active_focus) {
						document.getElementById('f_id_lieu').focus();
					}
				}
			} else {
				// On masque la boite de sélection
				document.getElementById('lieu_geographique').innerHTML = '';

				// On affiche la zone de saisie libre
				document.getElementById('ligne_lieu_geographique').style.display = '';
				document.getElementById('lieu_geographique_saisie').style.display = '';
				id_lieu_selectionne = -1;
				if (active_focus) {
					document.getElementById('f_libelle_lieulibre').focus();
				}
			}
		}   else {
			alert('There was a problem with the request.');
		}
	} else if (libelle_villelibre) {
		masqueZone();
		// On masque la boite de sélection
		document.getElementById('lieu_geographique').innerHTML = '';

		// On affiche la zone de saisie libre
		document.getElementById('ligne_lieu_geographique').style.display = '';
		document.getElementById('lieu_geographique_saisie').style.display = '';
		id_lieu_selectionne = -1;
		if (active_focus) {
			document.getElementById('f_libelle_lieulibre').focus();
		}
	} else {
		// pas de ville sélectionnée
		masqueLieu();
		afficheZone();

		// on reset la ville
		try{
			document.getElementById('f_id_localisation_1').value = '';
		} catch (e) {
		}
	}
}

// Active / Désactive la liste des zones géographiques
// Reset les listes et variables
function actionVilleSelectionneReportage() {

	var libelle_ville = "";
	if ( document.getElementById("f_localisation_1") )
		libelle_ville = document.getElementById("f_localisation_1").value;
	
	//console.log("=>"+libelle_ville);
	
	if ( libelle_ville != "" ) {
		if ( document.getElementById("f_libelle_complement_ville_zone") )
			document.getElementById("f_libelle_complement_ville_zone").style.display = "none";
			
		if ( document.getElementById("f_libelle_complement_ville_lieu") )
			document.getElementById("f_libelle_complement_ville_lieu").style.display = "";
	} else {
		if ( document.getElementById("f_libelle_complement_ville_zone") )
			document.getElementById("f_libelle_complement_ville_zone").style.display = "";
			
		if ( document.getElementById("f_libelle_complement_ville_lieu") )
			document.getElementById("f_libelle_complement_ville_lieu").style.display = "none";		
	}	
}


// Active / Désactive  le renseignement de la zone libre
function actionZoneSelectionne() {
	try {
		var f_id_zonegeographique	= document.getElementsByName('f_id_zonegeographique');
		var id_zone_selectionne		= document.getElementsByName('f_id_zone');
		var index_courant			= document.getElementById('f_id_pays').selectedIndex;
		var id_pays_selectionne		= document.getElementById('f_id_pays').options[index_courant].value;
		var id_ville_selectionne	= document.getElementsByName('f_id_ville');
		var id_villelibre_selectionne	= document.getElementsByName('f_id_villelibre');
		var libelle_zonelibre		= document.getElementById('f_libelle_zonelibre').value;

		f_id_zonegeographique		= f_id_zonegeographique.length	? f_id_zonegeographique[0].value	: null;
		id_zone_selectionne		= id_zone_selectionne.length		? id_zone_selectionne[0].value	: null;
		id_ville_selectionne		= id_ville_selectionne.length		? id_ville_selectionne[0].value	: null;
		id_villelibre_selectionne	= id_villelibre_selectionne.length 	? id_ville_selectionne[0].value	: null;
  	} catch (e) {
  	}

	if (!id_ville_selectionne && !id_villelibre_selectionne) {
		afficheZone();
	} else {
		masqueZone();
	}

	// Si on sélectionne le choix autre on propose le champ de saisie de la zone libre
	if (id_zone_selectionne == '-1' || id_zone_selectionne == null) {
		// active
		document.getElementById('zone_geographique_saisie').style.display = '';
		//document.getElementById('f_libelle_zonelibre').focus();
		if (document.getElementById('f_libelle_zonelibre').value.length) {
			masqueVille();
		} else {
			afficheVille();
		}

		id_zone_selectionne = -1;
	} else {
		// désactive
		document.getElementById('f_libelle_zonelibre').value = '';
		document.getElementById('zone_geographique_saisie').style.display = 'none';
		if (id_zone_selectionne) {
			masqueVille();
		} else {
			afficheVille();
		}
	}

	f_id_zonegeographique = id_zone_selectionne;
}


// Active / Désactive  le renseignement du lieu libre
function actionLieuSelectionne() {
	try {
		var f_id_lieugeographique	= document.getElementsByName('f_id_lieugeographique');
		var id_lieu_selectionne		= document.getElementsByName('f_id_lieu');
		var libelle_lieulibre		= document.getElementById('f_libelle_lieulibre').value;

		f_id_lieugeographique	= f_id_lieugeographique.length ? f_id_lieugeographique[0].value : null;
		id_lieu_selectionne	= id_lieu_selectionne.length ? id_lieu_selectionne[0].value : null;
  	} catch (e) {
  	}

	// Si on sélectionne le choix autre on propose le champ de saisie de la zone libre
	if (id_lieu_selectionne == '-1') {
		document.getElementById('lieu_geographique_saisie').style.display = '';
		document.getElementById('f_libelle_lieulibre').focus();
		id_lieu_selectionne = -1;
	} else {
		// désactive
		document.getElementById('lieu_geographique_saisie').style.display = 'none';
	}

	f_id_lieugeographique = id_lieu_selectionne;
}


// return : aucun
// Affecte à certains évènements d'un textarea, le contrôle de la longueur de son contenu
var max = 1000;
function compter(leTexte) {
	if (leTexte.value.length > max - 1) {
		leTexte.value = leTexte.value.substring(0, max - 1);
	}
}


function supprimeChoisirDeCategorieSelect() {
	categorieSelect = document.getElementById('f_id_categorie_0');
	if (!categorieSelect) {
		return false;
	}

	if (categorieSelect.removeEventListener) {
		categorieSelect.removeEventListener("focus", supprimeChoisirDeCategorieSelect, null);
	} else if(categorieSelect.detachEvent) {
		categorieSelect.detachEvent("onfocus", supprimeChoisirDeCategorieSelect);
	} else {
		return false;
	}

	categorieSelect.remove(0);
	categorieSelect.selectedIndex = 0;
	// Si on choisit la première catégorie, le onchange ne se déclanche pas
	// donc on l'appelle directement ici
	categorieSelect.onchange();

	return true;
}


// Au chargement...
function main() {
	/*
	 * On vérifie que la ville n'a pas été passé en paramètre
	 * sinon le libellé est effacé
	 */
	if (document.getElementById('f_localisation_1').value=='') {
		actionPaysSelectionne();
	}
	actionVilleSelectionne();
	actionZoneSelectionne();
	active_focus = true;

	listeIDCategorieDroitsDAuteur = document.getElementById('liste_id_categorie_droitsdauteur');
	if (!listeIDCategorieDroitsDAuteur || listeIDCategorieDroitsDAuteur.innerHTML == '') {
		listeIDCategorieDroitsDAuteur = new Array();
	} else {
		listeIDCategorieDroitsDAuteur = listeIDCategorieDroitsDAuteur.innerHTML.split(',');
	}

	categorieSelect = document.getElementById('f_id_categorie_0');
	if (categorieSelect) {
		if (categorieSelect.addEventListener) {
			categorieSelect.addEventListener("focus", supprimeChoisirDeCategorieSelect, null);
		} else if(categorieSelect.attachEvent) {
			categorieSelect.attachEvent("onfocus", supprimeChoisirDeCategorieSelect);
		}
	}

	reInitSelection();
}


// Au chargement d'un formulaire de reportage photo
function mainReportagePhoto() {
	
	categorieSelect = document.getElementById('f_id_categorie_0');
	if (categorieSelect) {
		if (categorieSelect.addEventListener) {
			categorieSelect.addEventListener("focus", supprimeChoisirDeCategorieSelect, null);
		} else if(categorieSelect.attachEvent) {
			categorieSelect.attachEvent("onfocus", supprimeChoisirDeCategorieSelect);
		}
	}

	reInitSelection();
}