(function($){  

	var settings;
	jQuery.fn.cmsAutoComplete = function(url, options) {
		
		
		
		
		settings = jQuery.extend({ 
			dataType			: 'jsonp', 
			parser				: defaultParser, 
			limit				: 30,
			cache				: true,
			timeout				: 10000,
			itemFormater		: defaultItemFormater,
			resultFormater		: defaultResultFormater, 
			width				: '560',
			scrollHeight		: '400', 
			autoCompleteFilter 	: {},
			autocompleteLibWhenEmpty: "",
			autoCompleteFilterSelector : []
		   }, options
		);
		
		var domObjProxy = $('<input type="text" id="lieu-proxy" />');
		
		
		
		var lieuxProxyInitialValue = $("#lieu").val();
		if (lieuxProxyInitialValue == '') {
			domObjProxy
				.val(settings.autocompleteLibWhenEmpty)
				.addClass('defaultValue')
			;
		} else {
			domObjProxy.val(lieuxProxyInitialValue);
		}
		
		//permettra de restreindre la recherche en forcant region, dept, ...
		var queryStringSystematique = '';
		if (settings.autoCompleteFilterSelector) {
			queryStringSystematique = $(settings.autoCompleteFilterSelector).serialize();
		}
		
		
		//afin de ne pas polluer les listenr avec les onchanger des saisies clavier, on passe par un input proxy :
		domObjProxy
			.insertAfter("#lieu")
			.b2fAutocomplete (url, {
				dataType					: settings.dataType, 
				parse						: settings.parser,
				selectFirst					: true,
				delay						: 200,
				formatItem					: settings.itemFormater,
				formatResult				: settings.resultFormater,
				mustMatch					: true,
				selectFirst					: true,
				width						: settings.width,
				scrollHeight				: settings.scrollHeight,
				scroll						: true,
				minChars					: 0,
				matchSubset					: false,
				autocompleteLibWhenEmpty	: settings.autocompleteLibWhenEmpty,
				extraParams					: {		
					limit				: settings.limit,
					dataType			: settings.dataType, 
					format				: settings.dataType,
					render_mode 		: settings.dataType,
					cache				: settings.cache,
					timeout				: settings.timeout, 
					filter				: settings.autoCompleteFilter,
					extraFilter			: queryStringSystematique
				}
			})
			.result(function(event, data, formatted) {
				if (data && data[1]) {
					var row = data[1] 
					jQuery.cmsAutoCompleteFillFormLieux(row);
				} else {
					jQuery.cmsAutoCompleteFillFormLieux({});
				}
				if ($(this).val() != settings.autocompleteLibWhenEmpty) {
					$("#lieu").val($(this).val());
					$("#lieu").change();
				}
					
			})
		;
		$("#lieu").css({display:"none"});
		
		
	}

	
	function defaultItemFormater(row, i, max, term) {
		return row[0];
	}
	function defaultResultFormater(row, i, max, term) {
		return row[0];
	}
	
	function defaultParser(data) {

		if (!data) return new Array({data:['<span class="error"  onclick="return false;"></span>',{}], value:'', result:'pas de correspondance'});
		
		var parsed = new Array();
		
		$.each(data, function(dataGrp, rows) {
			if (!rows || rows.length == 0) {
				return; 
			}
			$.each(rows, function(rowIndex, row) {
				
				var str = jQuery.cmsAutoCompleteLieuxRowToStr(row);
				
				var arr = new Array();
				arr[0] = str;
				arr[1] = row;
				arr[2] = dataGrp;
				arr[3] = rowIndex + 1;
				
				parsed[parsed.length] = {
					data: arr,
					value: str,
					result: str
				};
				
				
				return true;
			});
		});
		
		if (parsed.length == 0) {
			return new Array({data:['<span class="error"  onclick="return false;"></span>',{}], value:'', result:'pas de correspondance'});
		}
		
		return parsed;
	}
	
	jQuery.cmsAutoCompleteFillFormLieux = function(row) {
		if (row.ville != undefined && row.ville != null) {
			$('#lieux_ville').val(row.ville);
		} else {
			$('#lieux_ville').val('');
		}
		
		if (row.codePostal != undefined && row.codePostal != null) {
			$('#lieux_codePostal').val(row.codePostal);
		} else {
			$('#lieux_codePostal').val('');
		}
		if (row.departement != undefined && row.departement != null) {
			$('#lieux_departement').val(row.departement);
		} else {
			$('#lieux_departement').val('');
		}
		if (row.region != undefined && row.region != null) {
			$('#lieux_region').val(row.region);
		} else {
			$('#lieux_region').val('');
		}
		if (row.pays != undefined && row.pays != null) {
			$('#lieux_pays').val(row.pays);
		} else {
			$('#lieux_pays').val('france');
		}
	}
	jQuery.cmsAutoCompleteGetLieuxGeoEncoded = function() {
		row = {};
		row.ville 			= $('#lieux_ville').val();
		row.codePostal 		= $('#lieux_codePostal').val();
		row.departement 	= $('#lieux_departement').val();
		row.region 			= $('#lieux_region').val();
		row.pays 			= $('#lieux_pays').val();
		if (row.ville == '' && row.codePostal == '' && row.departement == '' && row.region == '') {
			return false;
		} 
		
		return row;
	}
	
	
	jQuery.cmsAutoCompleteLieuxRowToStr = function(row) {

		var str = new Array();
		/*
		if (row.numeroDeRue != undefined && row.numeroDeRue != null) {
			str[str.length] = row.numeroDeRue;
		}
		if (row.nomRue != undefined && row.nomRue != null) {
			str[str.length] = row.nomRue;
		}
		*/
		if (row.ville != undefined && row.ville != null) {
			str[str.length] = row.ville;
		}
		
		if (row.codePostal != undefined && row.codePostal != null) {
			str[str.length] = row.codePostal;
		}
		if (row.departement != undefined && row.departement != null) {
			str[str.length] = row.departement;
		}
		if (row.region != undefined && row.region != null) {
			str[str.length] = row.region;
		}
		if (row.pays != undefined && row.pays != null) {
			str[str.length] = row.pays;
		} else {
			str[str.length] = 'france';
		}
		str = str.join(', ', str);
		
		return str;
	}
})(jQuery); 