/**
 * Code spécifique à la gestion des lieux via le plugin autosuggest de JQuery
 */

/**
 * ... ? TODO
 */
var CORES = {
    'fr-FR'    	: 'fr',
    'en-GB'    	: 'uk',
    'es-ES'    	: 'es',
    'de-DE'    	: 'de',
    'be-FR' 	: 'be', 
    'be-NL' 	: 'be',
};

/**
 * Exécuté au chargement de la page, le code qui suit permet d'initialiser les appels ajax
 * pour l'outil autosuggest
 */
function ajaxSetup(){
    $jquery_1_5_2.ajaxSetup ({
    	accepts: {
    	    xml: "application/xml, text/xml",
    	    html: "text/html",
    	    script: "text/javascript, application/javascript",
    	    json: "application/json, text/javascript", 
    	    text: "text/plain",
    	    // Hack for Chrome/Safari
    	    _default: ""
    	}
        });

	// pour remplacer les accents sous ie6
    accentsTidy = function(s){
        var r=s.toLowerCase();
        r = r.replace(new RegExp("\\s", 'g')," ");
        r = r.replace(new RegExp("[àáâãäå]", 'g'),"a");
        r = r.replace(new RegExp("æ", 'g'),"ae");
        r = r.replace(new RegExp("ç", 'g'),"c");
        r = r.replace(new RegExp("[èéêë]", 'g'),"e");
        r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
        r = r.replace(new RegExp("ñ", 'g'),"n");                            
        r = r.replace(new RegExp("[òóôõö]", 'g'),"o");
        r = r.replace(new RegExp("œ", 'g'),"oe");
        r = r.replace(new RegExp("[ùúûü]", 'g'),"u");
        r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
        return r;
    };
}

function http500(){
	window.location = URL_RACINE+'generic/error.php?error_code=500';
}

/**
 * Recherche une localisation précédente pour le préremplissage du champs.
 */
function reloadLocalisation(lang, where, type_where){
	// si pas d'ancienne loc, on initialise juste le champs
	if(where == ""){
		initLocalisationSuggest(lang,new Array());
		return;
	}
	
    // si la ville est présente, on la recherche pour préremplir le champs
    if(where != "" && type_where != ""){
        var url = URL_SEARCH_LOCALISATION + CORES[lang] + "/select?q=url_wk:\"" + where.replace(" ", "%2B") + "\"&wt=json&json.wrf=?&hl=on&hl.fl=region_s,department_s,city_s,postal_code,depId,country_name_s";
    	// appel ajax pour la recherche de localisations
        $jquery_1_5_2.jsonp({
        	url: url,
        	error: function (){http500()},
        	success: function(data){
	    	    if(data.response != null){
		    		if(data.response.docs != null && data.response.docs.length > 0){
		    			var prefill_docs = new Array();
		    		    var doc = handleResults(data,lang, false);
		    		    prefill_docs.push(doc[0]);
		    		    initLocalisationSuggest(lang,prefill_docs);
		    		    return;
		    		}
	    	    }
	    	    initLocalisationSuggest(lang,new Array());
	    	    return;
    		}
        });
        
    } else {
        initLocalisationSuggest(lang,new Array());
    }
}

/**
 * Initialise le AutoSuggest pour une langue donnée.
 * Attention : une modification de l'appel dans le plugin autosuggest à été nécessaire : 
 * 	- ajout du paramètre lang, passé en option lors de l'init du plugin
 * @param lang : code langue
 * @param docs : tableau des docs a préremplir
 */
function initLocalisationSuggest(lang, docs){
	var ARGS_URL_SEARCH_LOCALISATION = "";
	if (lang == 'uk' ) {
		ARGS_URL_SEARCH_LOCALISATION = "&fq=hidden:0&wt=json&json.wrf=?&indent=on"
			+ "&qf=region_s^1.5 department_s^1.5 depId^1.5 postal_code^1.5 city_s^1.5 state_s^1.5"
			+ "&bf=sqrt(div(pop,10))&mm=0&fl=*,score"
			+ "&hl=on&hl.fl=region_s,department_s,city_s,postal_code,depId,country_name_s";
	} else {
		ARGS_URL_SEARCH_LOCALISATION = "&fq=hidden:0&wt=json&json.wrf=?&indent=on"
			+ "&qf=region_s^1.5 department_s^1.5 depId^1.5 postal_code^1.5 city_s^1.5"
			+ "&bf=sqrt(div(pop,10))&mm=0&fl=*,score"
			+ "&hl=on&hl.fl=region_s,department_s,city_s,postal_code,depId,country_name_s";
	}
    params = ARGS_URL_SEARCH_LOCALISATION;

    if (lang == 'be-FR') {
        params   = params + "&fq=lang:fr";
    } else if (lang == 'be-NL') {
        params   = params + "&fq=lang:nl";
    }
    
    // initialisation du champs de recherche
    $jquery_1_5_2("#"+lang).autoSuggest(URL_SEARCH_LOCALISATION+CORES[lang]+"/select",{
		initText: "", // initialise le champ avec un nom de ville
		freeInputAllowed:false,
		startText: TRANSLATIONS[lang].startText,
		selectedItemProp: "libelle",
		searchObjProps: "suggest",
		selectedValuesProp: "id",
		preFill: docs,
		keyDelay: 200,
		retrieveLimit: 10,
		selectionLimit: 1, // bride la possibilité de selectionner plusieurs lieux 
		selectionAdded:selectionAdded,
		emptyText: TRANSLATIONS[lang].emptyText,
		limitText: TRANSLATIONS[lang].limitText,
		resultsHighlight: false,
		beforeRetrieve: prepareQuery,
		retrieveComplete: handleResults,
	        keyDelay: 100,
		lang:lang,
		formatList: function(data, elem){ return elem.html(data.suggest); },
	    extraParams: params,
	    // TRI : pour éviter le conflit avec les mouseover de la map
	    showingResult:function(){$jquery_1_5_2("#map").css("position","static")},
	    closingResult:function(){$jquery_1_5_2("#map").css("position","relative")}
	    }
	);
}

/**
 * Traite le retour d'appel ajax pour la localisation (est également utilisée pour le preremplissage : traitement des retours de la recherche par défaut)
 * @param data : les données retournées par la recherche
 * @param lang : le langage paramétré (pour affichage des préfixes)
 * @returns la liste des résultats formatés
 */
function handleResults(data,lang,isChampsOk) {
    var docs = data.response.docs;
    var highlights = data.highlighting;
    
    for (var i=0; i<docs.length; i++) {
		var doc   = docs[i];        // the doc
		var id    = doc.id;        // its id
		var type  = doc.type;       // its type
		var hl    = highlights[id]; // its highlighting data
		
		var city  = isDef(hl) && isDef(hl.city_s)         ? hl.city_s.join(" ")         : doc.city;
		var cp    = isDef(hl) && isDef(hl.postal_code)    ? hl.postal_code.join(" ")    : doc.postal_code;
		var cnt   = isDef(hl) && isDef(hl.country_name_s) ? hl.country_name_s.join(" ") : doc.country_name;
		var reg   = isDef(hl) && isDef(hl.region_s)       ? hl.region_s.join(" ")       : doc.region;
		var dep   = isDef(hl) && isDef(hl.department_s)   ? hl.department_s.join(" ")   : doc.department;
		var depId = isDef(hl) && isDef(hl.depId)          ? hl.depId.join(" ")          : doc.depId;
		var pop   = doc.pop;
		var score = doc.score;
		
		switch(type) {
		case "city":
		    doc.suggest = TRANSLATIONS[lang].city+" : " + city + ", " + dep + ", " + reg;
		    doc.libelle = city;
		    break;
		case "department":
		    doc.suggest = TRANSLATIONS[lang].department+" : " + dep + ", " + reg;
		    doc.libelle = dep;
		    break;
		case "region":
		    doc.suggest = TRANSLATIONS[lang].region+" : " + reg;
		    doc.libelle = reg;
		    break;
		}
		docs[i] = doc;
    }
    return  docs;
};

/**
 * Fonction formattant les données pour la requête sur les villes
 * @param input valeur de recherche initiale
 * @returns l'input modifié
 */
function prepareQuery(input) {
    var tmp = accentsTidy(input);
    tmp = tmp.replace(" ", " AND ");
    var pos = tmp.lastIndexOf(" ");
    if (pos == -1) {
	tmp = tmp + " " + tmp;
    }
    return tmp;
};

/**
 * Détermine si une variable est définie
 * @param variable à tester
 * @returns true, si la variable est définie, false sinon
 */
function isDef(variable) {
    return typeof(variable) != "undefined";
}


