( function($) {

	var settings;
	var loadingOverLay;
	var searchStarted = false; 
	
	jQuery.fn.cntzRechercheDispo = function(action, options) {

		if (undefined == action) {
			action = 'init'
		}
		switch (action) {
			case 'showRegions':
				showRegions(options);
				break;
			case 'initGoogleMap':
				initGoogleMap(this);
				break;
			case 'trigger':
				trigger(this, options);
				break;
			case 'init':
			default:
				init(options, this);
		}
		return this;
	}
	
	function init(options, domObj) {
		//settings : var globale au scope de ce plugin
		settings = jQuery.extend( {
			enableAjaxFormSubmit			: true
			, target 						: $(domObj).attr('target')
			, autoCompleteUrl 				: false
			, autoCompleteSelector			: "#lieu"
			, autoCompleteFilterSelector	: $(domObj).find('.lieux-detail.forcedValue') //lieux-detail constitue les attributs hidden du lieux, et forced value signifie que cette valueur est figée sur cette page, il faut donc n'afficher que les resultats liés a cette valeur
			, mapSelector					: '#mapRelativeContainer'
			, mapApiKey						: null
			, autoCompleteFilter			: {}
			, autocompleteLibWhenEmpty 		: ""
			, dateLibWhenEmpty				: "" 
		}, options);
		
		

		initFilters(domObj);
		initMap(domObj);
		initFormulaire(domObj);
		initAutocomplete(domObj);
		initCalendar(domObj);
		initDivers(domObj);
		initPagination(domObj);
		//il reste un objet a initialiser, il le sera une fois la laiste des regions chargée en ajax
	}
	
	
	function trigger(domObj, action) {
		switch (action) {
		case 'submit':
			domObj.submit();
			break;
		default:
			// par defaut : on ne fait rien
		}

		return this;
	}

	function ajaxCall(options) {
		//si l'id qui recevra la reponse n'existe pas, on ne fait pas de requete pour rien (ex : cas de spages de contenu statique)
		if ($('#resultatRecherche').length == 0) {
			return false;
		}
		
		searchStarted = true;
		//console.debug(settings.autocompleteLibWhenEmpty, $('#lieu').val());
		if (! loadingOverLay) {
			loadingOverLay = $('#loadingOverLay').css({display: 'block'}).dialog({
				closeOnEscape	: false
				, position		: 'center'
				, title			: (settings.autocompleteLibWhenEmpty != $('#lieu').val())?$('#lieu').val():''
				, zIndex		: 3001
				, width			: 500
				, resizable		: false 
				, draggable		: false 
				, bgiframe		: true
			});
		} else {
			loadingOverLay
				.dialog('option', 'position', 'center')
				.dialog( 'open' );
		}
		
		var dialogReCenterInterval;
		var dialogReCenterTimeout = setTimeout(function() {
			dialogReCenterInterval = setInterval(function() {
				loadingOverLay.dialog('option', 'position', 'center');
			}, 500);
		}, 800)
		
		//$('.position-fixed.ui-dialog').css({position:"fixed"});
		loadingOverLay.parents('.ui-dialog').find('.ui-dialog-titlebar-close').css({display: 'none'});
		
		
		//$('#accordeonDroite').accordion('activate' , 0)
		//console.debug(options);
		if (options.disableAjax != undefined && options.disableAjax == true) {
			if (-1 != options.url.indexOf("?")) {
				var targetUri = options.url+'&'+options.data;
			} else {
				var targetUri = options.url+'?'+options.data;
			}
			document.location = options.url;
			
			return;
		}
		$.ajax( {
			data 		: options.data,
			mode		: "abort", //afin d'annuler la requete precedente
			dataType 	: 'html',
			type 		: 'get',
			url 		: options.url,
			complete 	: function() {
				loadingOverLay.dialog('close');
				clearTimeout(dialogReCenterTimeout);
				clearInterval(dialogReCenterInterval);
			}, 
			success 	: function(htmlResponse) {
				$('#resultatRecherche').html($('#resultatRecherche', htmlResponse).html());				
			}
		});// fin $.ajax()
		
		//ici, on verifie si une date est selectionnee, si elle l'es on active les filtres qui ne marchent que quand une date est choisie, sinon,on les cache
		if ('' != $('#debut').val()) {
			$('#blocFilterSearch .disableWTDate').parents('.ligne').show();
		} else {
			$('#blocFilterSearch .disableWTDate').parents('.ligne').hide();
		}
	}
	
	function initMap(domObj) {
		if ((jQuery.browser.msie && jQuery.browser.version.substr(0,1) == '6')) {
			$('#mapRelativeContainer').addClass('desactive-ie-6');
			
			if (-1 == document.cookie.search("__alertie6=false")) {
				document.cookie = '__alertie6=false';
				var dialog = $(
						"<div style='border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; height: 75px; position: relative;'>    " +
							"<div style='width: 640px; margin: 0 auto; text-align: left; padding: 0; overflow: hidden; color: black;'>      <div style='width: 75px; float: left;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-warning.jpg' alt='Attention!'/></div>      " +
							"<div style='width: 275px; float: left; font-family: Arial, sans-serif;'>        <div style='font-size: 14px; font-weight: bold; margin-top: 12px;'>Vous utilisez une ancienne version de navigateur non compatible avec certaines fonctionnalitées proposées par AllinFrance.com </div>        <div style='font-size: 12px; margin-top: 6px; line-height: 12px;'>Pour préserver votre expérience, certaines fonctionnalités du site ont dues être désactivées.Pour une meilleure expérience, installez un navigateur récent.</div>      </div>      " +
							"<div style='width: 75px; float: left;'><a href='http://www.firefox.com' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-firefox.jpg' style='border: none;' alt='Get Firefox 3.5'/></a></div>      <div style='width: 75px; float: left;'><a href='http://www.browserforthebetter.com/download.html' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-ie8.jpg' style='border: none;' alt='Get Internet Explorer 8'/></a></div>      <div style='width: 73px; float: left;'><a href='http://www.apple.com/safari/download/' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-safari.jpg' style='border: none;' alt='Get Safari 4'/></a></div>      <div style='float: left;'><a href='http://www.google.com/chrome' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-chrome.jpg' style='border: none;' alt='Get Google Chrome'/></a></div>    </div>  " +
						"</div> "
					).dialog({
						bgiframe 	: true
						, width		: 740
						, modal		: true
					})
				;
				
				setTimeout(function() {
					dialog.dialog('close');
				}, 20000);
			}
			
		} else {
			$.ajax({
				data 		: {render_mode:"ajax"},
				dataType 	: 'html',
				type 		: 'get',
				url 		: $('#lien-liste-regions-formulaire-wai').attr('href'),
				success 	: function(htmlResponse) {
					$('#liste-regions-formulaire-wai').html($('#liste-regions-formulaire-wai', htmlResponse).html());
					htmlResponse = null;//pour purger la memoire
					//la map ne peut pas etre initialisée avant que ce contenu ne soit chargé
					$(settings.mapSelector).mapHandler('init', {mapApiKey:settings.mapApiKey});
				}, 
				beforeSend : function(xhr) {
					$('#lien-liste-regions-formulaire-wai').hide('fast');
				}
			});
		}
		
			
	}
	
	function initAutocomplete(domObj) {
		if (settings.autoCompleteUrl && settings.autoCompleteSelector) {
			$(settings.autoCompleteSelector).cmsAutoComplete(
				settings.autoCompleteUrl
				, {
					autoCompleteFilter 				: settings.autoCompleteFilter
					, autocompleteLibWhenEmpty 		: settings.autocompleteLibWhenEmpty
					, autoCompleteFilterSelector 	: settings.autoCompleteFilterSelector
				}
			);
		}
	}
	
	function initPagination(domObj) {
		$('#paginatorBas a.pages, #paginatorHaut a.pages').live('click', function() {
			
			ajaxCall( {
				url 			: $(this).attr('href')
				, data 			: {render_mode:"ajax"}
				, disableAjax	: true
			});
			
			return false;
		});
	}
	
	function initFormulaire(domObj) {
		//contenu declechant un submit du form qui declenche a son tour un rafraichssement, a ne pas faire sur les page où on veut une recherche manuelle a l'aide du bouton "recherche"

		$('#blocFilterSearch :input, #mainForm :input').change( function() {
			if (settings.enableAjaxFormSubmit) {
				$(domObj).submit();
			} else {
				$(domObj).find(":submit").effect("highlight");
			}
		});
		$('#blocFilterSearch input:radio, #blocFilterSearch input:checkbox').click( function() {
			if (settings.enableAjaxFormSubmit) {
				$(domObj).submit();
			} else {
				$(domObj).find(":submit").effect("highlight");
			}
		});
		

		$(domObj).bind('submit', function(eventObject) {
			if (settings.enableAjaxFormSubmit) {
				ajaxCall( {
					data : $(this).serialize()+'&'+$('#blocFilterSearch input:radio, #blocFilterSearch :input, #blocFilterSearch input:checkbox, #Center-barre :input').serialize()+'&render_mode=ajax'
					, url : settings.target
				});
				
				eventObject.preventDefault();
				return false;
			} else {
				//on ajout les parametres qui en sont pas dans le form initialement
				var othersFormsToappend = $('<div />').hide().append($('#blocFilterSearch input:radio, #blocFilterSearch :input, #blocFilterSearch input:checkbox, #Center-barre :input'));
				$(domObj).append(othersFormsToappend);

				//et on laisse le submit se derouler normalement
				return ;
			}
				
		});
		
		
	}
	
	function initDivers(domObj) {
		//console.debug('test !'); 
		
		if (settings.enableAjaxFormSubmit && $("#resultatRecherche .row").length == 0) {
			setTimeout(function() {
				$(domObj).submit();//un timeout est posé pour laisser le tmeps au navigateur de se reposer un peu apres tout ce js
			}, 300);
		}
		
		//si une recherche a deja ete lancé, on ajoute les parametres dans les liens vers les autres categories... hack qui sera peut etre lnlevé si convient pas, ou sil on me demande trop de cas speciaux... 
		$('.lien-autre-categ-logement').click(function() {
			//console.debug('clic !'); 
			//if (searchStarted) {
				//console.debug('search demarrer !');
				var href = $(this).attr('href');
				if (-1 == href.indexOf('?')) {
					href += '?';
				} else {
					href += '&';
				}
				//console.debug($(domObj).serialize()); 
				//$(this).attr('href', href+$(domObj).serialize()+'&'+$('#blocFilterSearch .ajaxPropagationReady, #Center-barre :input').serialize());
				$(this).attr('href', href+$(domObj).serialize());
			//}
		});
	}
	
	function initFilters(domObj) {
		//ici, on verifie si une date est selectionnee, si elle l'es on active les filtres qui ne marchent que quand une date est choisie, sinon,on les cache
		if ('' != $('#debut').val()) {
			$('#blocFilterSearch .disableWTDate').parents('.ligne').show();
		} else {
			$('#blocFilterSearch .disableWTDate').parents('.ligne').hide();
		}
		
	}

	function initCalendar(domObj) {
		
		var jInputCal = $('input[rel="calendar"]');
		
		if (jInputCal.length > 0) {
			
			jInputCal.each(function(index, value) {
				var altFiled = 'calendarAltfieldDyn' + index;

				$(this).before('&nbsp;<span class="span-alt-field-debut" id="span'
					+ altFiled
					+ '"></span><input disabled="disabled" type="text" id="'
					+ altFiled
					+ '" style="display:none"></input>')
				;
				
				
				if ($(this).val() != '') {
					// on parse la date d'origine
					var objDate = $.datepicker.parseDate('yy-mm-dd', $(this).val());

					// et on la met dnas le format de travail
					$(this).val($.datepicker.formatDate('yy-mm-d', objDate))
					var dateStringified = $.datepicker.formatDate('D. d M. yy', objDate);
					$('#' + altFiled).val(dateStringified);
					$('#span' + altFiled).text(dateStringified);
				} else {
					$('#span' + altFiled).text(settings.dateLibWhenEmpty);
				}
				
				// puis on init le widget
				$(this).datepicker({
					changeMonth :true
					, changeYear :true
					, numberOfMonths :1
					, altField :'#' + altFiled
					, altFormat :'D. d M. yy'
					, dateFormat :'yy-mm-dd'
					, buttonImage :'/images/calendrier.gif'
					, showOn :'button'
					, buttonImageOnly :true
					, showButtonPanel :true
					, minDate: '+1d'
					, maxDate: '+1y'
					, onClose : function(dateText,inst) {
						if ($('#' + altFiled).val() != '') {
							$('#span' + altFiled).text($('#' + altFiled).val());
							//lors de la selection d'une date, on dereference le mois selectionné
							$('#moisdebut').val(0);
						} else {
							$('#span' + altFiled).text(settings.dateLibWhenEmpty);
						}
						//$(domObj).submit();
						$('#span' + altFiled).change();
					}
					, beforeShow: function(input, inst)  {
						//console.debug(input, inst.dpDiv, inst, {marginTop: -input.offsetHeight + 'px', marginLeft: input.offsetWidth + 'px'});
						var alt = $('#spancalendarAltfieldDyn0');
						
						setTimeout(function() {
							inst.dpDiv.css({top: alt.offset().top + 'px', left: alt.offset().left + 'px'});
						}, 300);
						
					}
					, showOptions: {
						 origin: ["bottom", "left"] 
					}
				});

				
			});
		}
		
		$('#moisdebut').change(function() {
			$('#debut').datepicker('setDate', '');
			$('.span-alt-field-debut').text(settings.dateLibWhenEmpty);
		});
		
		
	}

})(jQuery);
