// ===================================================================
// Title:       Javascript "searchListHelper.js"
// Description:	Fonctions javascript utilisées pour la gestion des 
//				listes de critères de recherche (User et Systeme).
//
// Copyright:	Copyright (c) 2007
// Company:		Progex Informatique Inc
// Author  		Marc Moreau
// ===================================================================

// Declaration des variables globales.
var CARACTERE_SEPARATEUR = "~";

var SELECTED_FONT_WEIGHT = "bolder";
var UNSELECTED_FONT_WEIGHT = "normal";

var SELECTED_COLOR = "white";
var UNSELECTED_COLOR = "black";
var SELECTED_BACKGROUND_COLOR = "maroon";
var UNSELECTED_BACKGROUND_COLOR = "transparent";

var DISPLAY_SEARCH_ITEM_VISIBLE = "list-item";
var DISPLAY_SEARCH_ITEM_INVISIBLE = "none";

var ATTRIBUT_UL = "ul";
var ATTRIBUT_LI = "li";
var ATTRIBUT_RADIO = "radio";
var ATTRIBUT_ID = "id";
var ATTRIBUT_LIST_ID = "listId";
var ATTRIBUT_ON_CLICK = "onclick";

var LIST_USER_DUMMY_CRITERIA_ID = "dummnyUserCriteria";
var LIST_USER_DUMMY_CRITERIA_ELEMENT = "<li style='color: black; background-color: transparent;' id='dummnyUserCriteria' listid='searchListUser' onclick='setSelected(this.getAttribute(\"listId\"), this.id);return false;'>dummyUserCriteria</li>";

var ID_SEARCH_CRITERIA_FORM = "searchCriteriaForm";
var ID_SEARCH_LIST_USER = "searchListUser";
var ID_SEARCH_LIST_SYS_CATEGORIE = "searchListSysCategorie";
var ID_SEARCH_LIST_SYS_CRITERIA = "searchListSysCriteria";
var ID_TYPE_RECHERCHE_PAR_CATEGORIE = "typeRechercheParCategorie";
var ID_TYPE_RECHERCHE_PAR_NOM = "typeRechercheParNom";

var	TYPE_RECHERCHE_PAR_CATEGORIE = "parCategorie";
var	TYPE_RECHERCHE_PAR_NOM = "parNom";

// Déclaration des messages d'erreur.
// Ces erreurs sont redéfinies dans la page BaseLayout.jsp pour avoir I18N.
var ERROR_ELEM_SELECTED_USER_LIST = "ERROR_ELEM_SELECTED_USER_LIST .. à définir ..";
var ERROR_ELEM_SELECTED_SYS_LIST = "ERROR_ELEM_SELECTED_SYS_LIST .. à définir ..";
var ERROR_ELEM_EXIST_USER_LIST = "ERROR_ELEM_EXIST_USER_LIST .. à définir";


// ===================================================================
// Initialise les différentes listes de critères de recherche.
// 
// param	none
//        
// return	none
// ===================================================================
function searchListInit() {
	// Set l'élément "type de recherche".
	if (typeRecherche == TYPE_RECHERCHE_PAR_CATEGORIE) {
		document.getElementById(ID_TYPE_RECHERCHE_PAR_CATEGORIE).checked=true;
	} else {
		document.getElementById(ID_TYPE_RECHERCHE_PAR_NOM).checked=true;
	}	
	
	// La première catégorie et le premier élément de cette catégorie
	// doivent être sélectionnés.
	var	indNiveau1 = 0;
	var	indNiveau2Categorie = 0;
	var	indNiveau2Critere = 0;

	// Patch pour firefox.
	if ( !isBrowserTypeMSIE() ) {
		indNiveau1 = 1;
		indNiveau2Categorie = 1;
		indNiveau2Critere = 1;
	}

	var categorieNode = document.getElementById(ID_SEARCH_LIST_SYS_CATEGORIE).childNodes[indNiveau1].childNodes[indNiveau2Categorie];
	setSelected(categorieNode.getAttribute(ATTRIBUT_LIST_ID), categorieNode.id);
	setVisible(ID_SEARCH_LIST_SYS_CRITERIA, categorieNode.id);

//	var criteriaNode = document.getElementById(ID_SEARCH_LIST_SYS_CRITERIA).childNodes[indNiveau1].childNodes[indNiveau2Critere];
//	setSelected(criteriaNode.getAttribute(ATTRIBUT_LIST_ID), criteriaNode.id);
	
}

// ===================================================================
// Extraire la liste des critères de recherche du membre et l'assigner
// à l'élément reçu en paramètre.
// 
// param	listId : Id de la liste contenant les critères de recherche. 
// 			searchCriteriaUser : Elément qui contiendra la liste de critères
//								 résultante.
//        
// return	FALSE si aucun critère existe dans la liste, sinon TRUE
// ===================================================================
function setSearchCriteriaUser(listId, searchCriteriaUser) {
	var destElement = "";
	var listCriteres = document.getElementById(listId).getElementsByTagName(ATTRIBUT_LI);
	
	for (var i = 0; i< listCriteres.length;i++) {
		if (destElement != "") {
			destElement = destElement + CARACTERE_SEPARATEUR;
		}
		destElement = destElement + listCriteres[i].id;
	}
	searchCriteriaUser.value = destElement;
	return true;
}

// ===================================================================
// Vide le contenu des criteres de recherche.
// 
// param	none
//        
// return	none
// ===================================================================
function clearSearchCriteria() {
	myAlert("");
	document.getElementById(ID_SEARCH_LIST_USER).innerHTML = "";
	document.getElementById(ID_SEARCH_CRITERIA_FORM).searchCriteriaUser.value = "";
}

// ===================================================================
// A partir d'une liste, rendre visible uniquement l'élément dont "Id"
// est égal à celui reçu en paramètre. 
// 
// param	rootListId : Id de la liste utilisé pour la recherche.
// 			elemId : Id de l'élément qui doit demeurrer visible. 
//        
// return	none
// ===================================================================
function setVisible(rootListId, elemId) {
	var premierListe = true;
	var listElemLI = "";
	var listElemUL = document.getElementById(rootListId).getElementsByTagName(ATTRIBUT_UL);
	for (var i = 0; i< listElemUL.length;i++) {
		if (listElemUL[i].id == elemId) {
			listElemUL[i].style.display = DISPLAY_SEARCH_ITEM_VISIBLE;
			if (premierListe) {
				listElemLI = listElemUL[i].getElementsByTagName(ATTRIBUT_LI);
//				listElemLI[0].style.color = SELECTED_COLOR;
//				listElemLI[0].style.backgroundColor = SELECTED_BACKGROUND_COLOR;
				premierListe = false;
			}
		} else {
			listElemUL[i].style.display = DISPLAY_SEARCH_ITEM_INVISIBLE;
		}
	}
	document.getElementById(rootListId).scrollTop = 0;
}

// ===================================================================
// A partir d'une liste, mettre en mode "unSelected" l'ensemble de ces
// éléments.
// 
// param	rootListId : Id de la liste utilisé.
//
// return	none
// ===================================================================
function setAllUnSelected(rootListId) {
	var listElem = document.getElementById(rootListId).getElementsByTagName(ATTRIBUT_LI);
	for (var i = 0; i< listElem.length;i++) {
		listElem[i].style.color = UNSELECTED_COLOR;
		listElem[i].style.backgroundColor = UNSELECTED_BACKGROUND_COLOR;
	}
}

// ===================================================================
// A partir d'une liste, mettre en mode "selected" uniquement l'élément
// dont "Id" est égal à celui reçu en paramètre. 
// 
// param	rootListId : Id de la liste utilisé pour la recherche.
// 			elemId : Id de l'élément qui doit etre "selected". 
//        
// return	none
// ===================================================================
function setSelected(rootListId, elemId) {
	var listElem = document.getElementById(rootListId).getElementsByTagName(ATTRIBUT_LI);
	for (var i = 0; i< listElem.length;i++) {
		if (listElem[i].id == elemId) {
			listElem[i].style.color = SELECTED_COLOR;
			listElem[i].style.backgroundColor = SELECTED_BACKGROUND_COLOR;
		} else {
			listElem[i].style.color = UNSELECTED_COLOR;
			listElem[i].style.backgroundColor = UNSELECTED_BACKGROUND_COLOR;
		}
	}
}

// ===================================================================
// A partir d'une liste, extraire le premier élément qui est "selected".
// 
// param	rootListId : Id de la liste utilisé pour la recherche.
//        
// return	Élément trouvé sinon une chaîne vide.
// ===================================================================
function getSelected(rootListId) {
	var listElem = document.getElementById(rootListId).getElementsByTagName(ATTRIBUT_LI);
	for (var i = 0; i< listElem.length;i++) {
		if (listElem[i].style.color == SELECTED_COLOR) {
			return (listElem[i]);
		}
	}
	return ("");
}

// ===================================================================
// A partir d'une liste, extraire le premier élément dont "Id" est 
// égal à celui reçu en paramètre.
// 
// param	rootListId : Id de la liste utilisé pour la recherche.
// 			elemId : Id de l'élément qui est recherché. 
//        
// return	Noeud trouvé sinon une chaîne vide.
// ===================================================================
function getElemById(rootListId, elemId) {
	var listElem = document.getElementById(rootListId).getElementsByTagName(ATTRIBUT_LI);
	for (var i = 0; i< listElem.length;i++) {
		if (listElem[i].id == elemId) {
			return (listElem[i]);
		}
	}
	return ("");
}

// ===================================================================
// Extraire des listes de critères de recherche système ( une liste 
// de "catégorie" et une liste de "critère"), les éléments de type "selected"
// et ajout de ces derniers dans la liste de critère de recherche du membre.
// 
// param	searchListUser : Liste de recherche destination dans laquelle 
//							 on désire ajouter les éléments "selected".
// 			searchListSysCategorie : Liste de recherche "catégorie"
// 			searchListSysCriteria : Liste de recherche "critère"
//        
// return	none
// ===================================================================
function addSelectedItem(searchListUser, searchListSysCategorie, searchListSysCriteria) {
	var selectedElemCategorie, selectedElemCriteria;
	var elemCriteria;

	myAlert("");

	selectedElemCategorie = getSelected(searchListSysCategorie);
	selectedElemCriteria = getSelected(searchListSysCriteria);

	// Un élément doit être sélectionné dans la liste "catégorie" et "critère".
	if (selectedElemCategorie == "" || selectedElemCriteria == "" ) {
		myAlert(ERROR_ELEM_SELECTED_SYS_LIST);
		return;	
	}

	// Vérifier que l'élément de la liste de recherche "critère" n'existe pas
	// dans la liste de recherche système avant de l'ajouter.
	elemCriteria = getElemById(searchListUser, selectedElemCriteria.id);
	if ( elemCriteria == "" ) {
		// Élément n'a pas été trouvé.
		// Création de l'élément "critère"
		document.getElementById(searchListUser).innerHTML = document.getElementById(searchListUser).innerHTML + LIST_USER_DUMMY_CRITERIA_ELEMENT;

		elemCriteria = getElemById(searchListUser, LIST_USER_DUMMY_CRITERIA_ID);
		elemCriteria.setAttribute(ATTRIBUT_LIST_ID, searchListUser);
		elemCriteria.setAttribute(ATTRIBUT_ID, selectedElemCriteria.getAttribute(ATTRIBUT_ID));
		elemCriteria.innerHTML = selectedElemCriteria.innerHTML;
	}
	
	setAllUnSelected(searchListUser);
}
	
// ===================================================================
// Détruire l'élément de type "selected" de la liste reçue en paramètre.
// Si ce dernier est une "catégorie", détruire aussi les "critères" de
// cette "catégorie".
//
// param	rootListId : Id de la liste utilisé pour le traitement.
//        
// return	none
// ===================================================================
function removeSelectedItem(rootListId) {
	var parentSelectedElem;
	var selectedElem = getSelected(rootListId);

	myAlert("");

	// Un élément doit être sélectionné dans la liste.
	if (selectedElem == "") {
		myAlert(ERROR_ELEM_SELECTED_USER_LIST);
		// Vider la section résultat - Bug d'affichage
		if (document.getElementById("resultRegionTableAbrege") != null) {
			document.getElementById("resultRegionTableAbrege").innerHTML = "<tr><td><br></td></tr>";
		}
		if (document.getElementById("resultRegionTableDetaille") != null) {
			document.getElementById("resultRegionTableDetaille").innerHTML = "<tr><td><br></td></tr>";
		}
		if (document.getElementById("resultatBarFin") != null) {
			document.getElementById("resultatBarFin").innerHTML = "";
		}
	} else {
		// Détruire un seul critère 
		parentSelectedElem = selectedElem.parentNode;
		parentSelectedElem.removeChild(selectedElem);
	}
}
