/*******************************************
	j_autocomplete
	
	Fonction qui appelle le plugin $.autocomplete() de jquery,
	lui passe les bons paramètres,
	et modifie ces paramètres selon un critère sélectionné dans une liste d'option.

*******************************************/

$.fn.extend({

	j_autocomplete : function(conf) {
		// Configuration :
		var preconf = {
			// Parametres par défaut :
			param : {
				url : "zonages.xml.asp", // string : adresse du xml générant les échos
				critere : false, // bool, string : sélecteur de la liste des critères [ex : "select[name=nivgeo]"]
				cacher : false // bool, string : critères cachant l'autocomplétion [ex : "F|MET"]
			},
			// Classes pour modifier les parametres par défaut :
			classes : {
				url : "j_autocomplete_url",
				critere :"j_autocomplete_critere",
				cacher : "j_autocomplete_cacher"
			},			
			// Options de l'autocomplétion :
			options : {
				matchSubset: 0, // Cache désactivé en raison des changements de zones
				parse: function(xml) { // Parse le xml et retourne les données pour formatItem et formatResult	
					var results = [];
					$(xml).find('zone').each(function() {
						var text =  $.trim($(this).text()) ;
						// [ex : c_codgeo =  $.trim($(this).attr("c_codgeo")) ; ] 
						results[results.length] = { 
							'data': { text: text }, // Pour formatItem [ex : { nivgeo : nivgeo }  ]
							'result': text // Pour formatResult [ex : 'result': text + " ("+codgeo+") " ]
						};
					});
					return results;
				} ,
				prepareTerm :  function(valeur) { // Modification du plugin pour les accents :
					return valeur
						.replace(/[àâä]/gi,'a')
						.replace(/[éèêë]/gi,'e')
						.replace(/[îï]/gi,'i')
						.replace(/[ôö]/gi,'o')
						.replace(/[ùû]/gi,'u')
						.replace(/[ç]/gi,'c')
						.replace(/[()]/gi,' ')
						.toLowerCase() ;
				},			
				formatItem: function(data) { // Mise en forme de la liste des échos [ ex : data.text + " (" + data.codgeo +")" ]
					return  data.text  ;
				},
				formatResult: function(result) { // Mise en forme du résultat dans la zone de saisie
					return  result ;
				},
				scroll: false
			}
		}
		conf = $.extend({param:{},classes:{},options:{}},conf) ;
		conf = {
			param : $.extend(preconf.param,conf.param),
			classes :  $.extend(preconf.classes,conf.classes),
			options :  $.extend(preconf.options,conf.options)
		}
		
		// Application :
		return this.each(function() {
	
			var $input = $(this) ;
			var param = conf.param ;
			
			// Modification des paramêtres :
			$.each(["critere","url","cacher"], function(i, n) {
				$input.nextAll("input."+conf.classes[n]).eq(0).each(function(){
						param[n] = $(this).val() ;
				});
			});
			
			// Objet de l'autocomplétion :
			var $ac = $input.autocomplete(param.url, conf.options) ;
			
			// Résolution d'un bug ie6 (boîtes de sélection au premier plan)
			$('.ac_results').bgiframe();

			// Critère pour l'autocomplétion :
			if( typeof(param.critere)=='string' ) {
				var $extraParam = $(param.critere).eq(0) ;
				var $label = $("label[for="+$input.attr('id')+"]")  ;

				// Modifications selons la liste d'option sélectionnée
				addExtraParam() ;

				// L'autocomplétion change en fonction de ce paramètre :
				$extraParam.change(function(){
					$input.val("") ;
					addExtraParam() ;
				});
			}
			
			// Fonction qui lie le critère à l'autocomplétion :
			function addExtraParam() {
			
				if($extraParam.is("select")) {
					var selectVal = $extraParam.find("option:selected").eq(0).val() ;
				} else if($extraParam.is("input")) {
					var selectVal = $extraParam.val() ;
				}
				// Cacher la zone de saisie ?
				if(typeof(param.cacher)=='string') {
					if (RegExp("^("+$.trim(param.cacher)+")$","i").test(selectVal))
						$input.add($label).hide() ;
					else
						$input.add($label).show() ;
				}
				
				// Ajout du critère pour l'autocomplétion :
				$ac.setOptions({
					extraParams: { "critere" : selectVal }
				});
				// Cache vidé pour que les anciennes valeurs ne soient pas mémorisées :
				$ac.flushCache() ;		
			}
			
		});
	}
}) ;

