YAHOO.namespace("calendar");

Date.prototype.addMonths = function (m) {
	var d = new Date (this.getTime());
	d.setMonth (d.getMonth() + m);
	return d;
}

Date.prototype.delMonths = function (m) {
	var d = new Date (this.getTime());
	d.setMonth (d.getMonth() - m);
	return d;
}
Date.prototype.delSeconds = function () {
	var d = new Date (this.getTime());
	d.setSeconds (d.getSeconds() - 1);
	return d;
}

YAHOO.calendar.init = function() {
	jQuery("#region-lien").hide();
	var today = new Date();
	var defaultCalendarState = (today.getMonth() + 1) + "_" + today.getFullYear();
	var bookmarkedCalendarState = YAHOO.util.History.getBookmarkedState("calendrier");
	var initialCalendarState = bookmarkedCalendarState || defaultCalendarState;
	
	var calendrierEvenements;
	var goldSelected = "a";
	var isPrixGouv = false;
	
	var gEvent = YAHOO.util.Dom.get("contenant-liste-evenement");

	var gmaxMonth = new Date().addMonths(6);
	var gminMonth = new Date().delMonths(6);
	
	gmaxMonth.setDate(1); // set to the first day of the month
	gmaxMonth.setHours(0); // set to 00:00:00;
	gmaxMonth.setMinutes(0);
	gmaxMonth.setSeconds(0);
	gmaxMonth.delSeconds(); // Now go back to the last month.

	YAHOO.util.History.register("calendrier", initialCalendarState, function (state) {
		// This is called after calling YAHOO.util.History.navigate, or after the user
		// has trigerred the back/forward button. We cannot discrminate between
		// these two situations.
		
		var _index = state.indexOf("_");
		var yearValue = parseInt(state.substring(_index + 1, state.length));
		var monthValue = parseInt(state.substring(0, _index));
		
		if(isNaN(yearValue) || isNaN(monthValue) || yearValue < 1950 || yearValue > 2050 ){/*Date invalide*/
			calendrierEvenements.cfg.setProperty("pagedate", defaultCalendarState.replace("_", "/"));
		}else{ /*Date valide*/
			calendrierEvenements.cfg.setProperty("pagedate", state.replace("_", "/"));
		}
		
		calendrierEvenements.render();
		loadShowMonthEvent();
	});
	
	function fnc_after(date, compareTo) {
		var ms = compareTo.getTime();
		if (date.getTime() >= ms) {
			return true;
		} else {
			return false;
		}
	};
	
	function fnc_before(date, compareTo) {
		var ms = compareTo.getTime();
		if (date.getTime() <= ms) {
			return true;
		} else {
			return false;
		}
	};
	
	function fnc_between(date, dateBegin, dateEnd) {
		if (fnc_after(date, dateBegin) && fnc_before(date, dateEnd)) {
			return true;
		} else {
			return false;
		}
	};
	
	function convertToDate(date) {
		var l_date = date.replace(/-/g,"/");   /* Convert YYYY-MM-DD to YYYY/MM/DD */
		return new Date(l_date);	
	}
	
	function convertDateToString(a_date) {
		var month = a_date.getMonth() + 1;
		var year = a_date.getFullYear();
		var day = a_date.getDate();
		
		
		var sTempMonth = "" + month;
		var sMonth = "0" + sTempMonth;
		sMonth = sMonth.substring(sMonth.length-2, sMonth.length);
		
		var sTempDay = "" + day;
		var sDay = "0" + sTempDay;
		sDay = sDay.substring(sDay.length-2, sDay.length);
		
		return year + "/" + sMonth + "/" + sDay;
	}
	
	function getThemeSelected() {
		var themes = YAHOO.util.Dom.get("cal_themes");
		if(themes != null) {
			var selIndex = themes.selectedIndex;
			var selValue = themes.options[selIndex].value;
			return selValue;
		}
		return "all";
	}
	
	function getRegionSelected() {
		var regions = YAHOO.util.Dom.get("cal_regions");
		if(regions != null) {
			var selIndex = regions.selectedIndex;
			var selValue = regions.options[selIndex].value;
			var finRegion = selValue.indexOf('|');
			if (finRegion == -1){
				finRegion = selValue.length;
			}
			return selValue.substring(0, finRegion);
		}
		
		return "all";	
	}
	function getDateSelected() {
		var selectedDate = calendrierEvenements.getSelectedDates();
	
		var retour;

		if(selectedDate == "") {
			retour = "a";
		} else {
			retour = selectedDate[0];
		}
		return retour;
	}
	
	function getDateSelectedString() {
		var selDate = getDateSelected();
		if(selDate != "a") {

			var month = selDate.getMonth() + 1;
			var year = selDate.getFullYear();
			var day = selDate.getDate();
			
			
			var sTempMonth = "" + month;
			var sMonth = "0" + sTempMonth;
			sMonth = sMonth.substring(sMonth.length-2, sMonth.length);
			
			var sTempDay = "" + day;
			var sDay = "0" + sTempDay;
			sDay = sDay.substring(sDay.length-2, sDay.length);
			
			return year + "/" + sMonth + "/" + sDay;
		}
		return "";
	}
	

	
	function refreshEventList(isAllMonth) {
		
		var nbShownRows = 0;
		
		jQuery(document).ready(function() {
		
		//on doit cacher cette  section par défaut, sinon l_urlRegion gardera l'anciene valeur dans le cas ou la nouvelle région choisie n'a pas d'URL 
		jQuery("#region-lien").hide();			

		var theme = getThemeSelected();
		var region = getRegionSelected();

		if(getDateSelectedString() == "" ) { //nothing selected
			isAllMonth = true;
		}
		var rowStripping=0;
			jQuery("#liste-evenement .evenement").each(function(i) {
				nbShownRows++;
				var isBetween = true;
				if(isAllMonth != true) {
					//Exemple : 2011-02-02 quand la datedebut = datefin / 2011-01-30 au<br> 2011-02-05 quand datedebut != datefin
					var l_debut = jQuery.trim($(this).children(".col1").children(".liste-evenement-body-date").html());
					var l_fin = l_debut;
					if (l_debut.length > 10){
						l_debut = l_debut.substring(0,10);
						l_fin = l_fin.substring(l_fin.length - 10);
					}
					
					var l_datedebut = convertToDate(l_debut);
					var l_datefin = convertToDate(l_fin);
					
					var dateSelected = getDateSelectedString();
					isBetween = fnc_between(new Date(dateSelected), l_datedebut, l_datefin);
				} else {
					isBetween = true;
				}

				var isRightTheme = true;
				var isRightRegion = true;
				
				//alert("theme:" + theme + "region:" +  region + "isBetween:" + isBetween);

				if(theme != "all") {
					isRightTheme = $(this).hasClass(theme);
				}
				if(region != "all") {
					isRightRegion = $(this).hasClass(region);
				}

				$(this).removeClass("odd");

				if(isBetween && isRightTheme && isRightRegion) {
					$(this).show();
					if(rowStripping%2) {
						$(this).addClass("odd");
					}
					rowStripping++;
				} else{
					nbShownRows --;
					$(this).hide();
				}
			});
			
			if(nbShownRows == 0){
				jQuery("#liste-evenement").hide();
				if(!isPrixGouv) {
					jQuery("#noevent").show();
				}
				
			} else {
				jQuery("#liste-evenement").show();
				jQuery("#noevent").hide();
			}
			//Traite les régions et les URLs associés à chacune d'elle
			if(region != null && region != "all") {
				
				var urlRegion = $('#cal_regions :selected').val();
				
				var debutUrl = urlRegion.indexOf('|');
				if (debutUrl == -1){
					urlRegion = null;
				}
				else{
					urlRegion = urlRegion.substring(debutUrl + 1);
				}
				//Dans le cas ou une région a un URL on affiche la section
				if (urlRegion != null){			
					$("#url-region-lien").attr("href", urlRegion);
					$("#url-region-lien").attr("title", urlRegion);
					$("#url-region-lien").text(urlRegion);
					$("#region-lien").show();
				}
			}

		});
	}

	function mySelectHandler(type,args,obj) {
		var selected = args[0]; 
	    var selDate = this.toDate(selected[0]); 

		if(goldSelected != "a") {
		 	if(convertDateToString(selDate) == convertDateToString(goldSelected)) {
		 		calendrierEvenements.deselectAll(); // Deselect everything
		 		goldSelected = "a"; // remet a vide le oldSelected
		 		calendrierEvenements.render(); // reaffiche le calendrier
		 		var l_date = calendrierEvenements.cfg.getProperty("pagedate");
		 		validNavArrow(l_date);
		 		refreshEventList(true);
		 	} else {
				refreshEventList(false);
		 	}
		} else {
			refreshEventList(false);
		}
		
	}
	
	function validNavArrow(a_date) {
		if((a_date.getMonth() == gmaxMonth.getMonth()) && (a_date.getFullYear() == gmaxMonth.getFullYear())) {
			jQuery(document).ready(function() {
				jQuery(".calnavright").hide();
			} );
		}
		if((a_date.getMonth() == gminMonth.getMonth()) && (a_date.getFullYear() == gminMonth.getFullYear())) {
			jQuery(document).ready(function() {
				jQuery(".calnavleft").hide();
			} );
		}
	}
	
	function myBeforeDeselectHandler() {
	   goldSelected = getDateSelected();
	}
	
	function resetRecherche() {
		calendrierEvenements.deselectAll(); // Deselect everything
		$('#cal_themes').val('all');
		$('#cal_regions').val('all');
		goldSelected = "a"; // remet a vide le oldSelected
		calendrierEvenements.render(); // reaffiche le calendrier
 		var l_date = calendrierEvenements.cfg.getProperty("pagedate");
 		validNavArrow(l_date);
		refreshEventList(true);
	}
			
	function myAfterRenderHandler() {
		
		jQuery(document).ready(function() {
			jQuery("#cal_month_label").click(resetRecherche);
			jQuery("#calendrierEvenements .reset").click(resetRecherche);
		} );
	}
	
	function loadShowMonthEvent() {
		calendrierEvenements.deselectAll(); // Deselect everything because it's a new month.
		var l_date = calendrierEvenements.cfg.getProperty("pagedate");
		
		var month = l_date.getMonth() + 1;
		var year = l_date.getFullYear();
		var day = "01";
		
		//Change la selection dans la liste <select id="cal_mois"> selon le mois
		var selMonth = document.getElementById("cal_mois");
		var strValue = "";
		var keyMonth = month - 1;

		for(var i = 0; i < 13; i++){
			var optionMonth = selMonth.options[i].value.substring(6, selMonth.options[i].value.indexOf('year:'));
			var optionYear = selMonth.options[i].value.substring(selMonth.options[i].value.indexOf('year:') + 5);
			if(optionMonth == month-1 && optionYear == year){
				selMonth.selectedIndex = i;
				break;
			}
		}

		validNavArrow(l_date);
		
		if(l_date > gmaxMonth && !(l_date.getMonth() == gmaxMonth.getMonth() && l_date.getFullYear() == gmaxMonth.getFullYear())) {
			//alert(l_date + "BB" +  gminMonth);
			//alert("I DID IT MAX");
			//calendrierEvenements.previousMonth();
			calendrierEvenements.setMonth(gmaxMonth.getMonth());
			calendrierEvenements.setYear(gmaxMonth.getFullYear());
			calendrierEvenements.render(); // reaffiche le calendrier
		}
		
		
		if(l_date < gminMonth && !(l_date.getMonth() == gminMonth.getMonth() && l_date.getFullYear() == gminMonth.getFullYear())) {
			//calendrierEvenements.nextMonth();
			calendrierEvenements.setMonth(gminMonth.getMonth());
			calendrierEvenements.setYear(gminMonth.getFullYear());
			calendrierEvenements.render(); // reaffiche le calendrier
		}
		
		var sTempMonth = "" + (month);
		var sMonth = "0" + sTempMonth;
		sMonth = sMonth.substring(sMonth.length-2, sMonth.length);
		
		var sDate = year + "-" + sMonth + "-" + day;
		if ( disableUnusedDate == undefined ) {
			disableUnusedDate = false;
			
		}
		Evenements.getEvenementsDateByMonth(sDate,cal_portail,cal_id,cal_lang,disableUnusedDate, function(data) {
			if(data.htmlContent != null){
				gEvent.innerHTML = data.htmlContent;
			}
			
			if(disableUnusedDate == true && data.usedDate != null) {
				var dates = new Array(data.usedDate.length);
				dates = data.usedDate;
				isPrixGouv = true;
				for (var i = 0; i < dates.length; i++){
					calendrierEvenements.addRenderer(dates[i], function(workingDate, cell) {
	                    YAHOO.widget.Calendar.prototype.styleCellDefault.call(calendrierEvenements, workingDate, cell);
	                    YAHOO.widget.Calendar.prototype.renderCellDefault.call(calendrierEvenements, workingDate, cell);
	                    return YAHOO.widget.Calendar.STOP_RENDER;
	                });
				}
				
			}
			
			calendrierEvenements.render(); // reaffiche le calendrier
			refreshEventList(true);
			validNavArrow(l_date);
			loadBandeauSortie("a");
		});
		
	}	


				
	function handleCalendarBeforeRender () {
		var calDate, newState, currentState;
		
		calDate = calendrierEvenements.cfg.getProperty("pagedate");
		newState = (calDate.getMonth() + 1) + "_" + calDate.getFullYear();
		
		try {
			currentState = YAHOO.util.History.getCurrentState("calendrier");
			// The following test is crucial. Otherwise, we end up circling forever.
			// Indeed, YAHOO.util.History.navigate will call the module onStateChange
			// callback, which will call createCalendar, which will call calendar.render(),
			// which will end up calling handleCalendarBeforeRender, and it keeps going
			// from here...
			if (newState !== currentState) {
				YAHOO.util.History.navigate("calendrier", newState);
			}
		} catch (e) {
			calendrierEvenements.cfg.setProperty("pagedate", newState.replace("_", "/"));
			calendrierEvenements.render();
			loadShowMonthEvent();
		}
	}
	
	
	function updateCal() {
		var selMonth = document.getElementById("cal_mois"); 
	 
		var selIndex = selMonth.selectedIndex;
		
		var year = selMonth.options[selIndex].value.substring(selMonth.options[selIndex].value.indexOf('year:') + 5);
		var month = selMonth.options[selIndex].value.substring(6, selMonth.options[selIndex].value.indexOf('year:'));
		
		month = parseInt(month) + 1;
		year = parseInt(year);
	 
		if (! isNaN(month) && ! isNaN(year)) { 
			calendrierEvenements.cfg.setProperty("pagedate", month + "/" + year); 
			calendrierEvenements.render(); 
		} 
	}

	function initCalendar (startDate) {
		config = translate_config;
		config['pagedate'] = startDate;
	
		calendrierEvenements = new YAHOO.widget.Calendar("calendrierEvenements","contenant-calendrier",config);	
		calendrierEvenements.beforeRenderEvent.subscribe(handleCalendarBeforeRender, calendrierEvenements, true);
		calendrierEvenements.selectEvent.subscribe(mySelectHandler, calendrierEvenements, true);
		calendrierEvenements.beforeDeselectEvent.subscribe(myBeforeDeselectHandler, calendrierEvenements, true);
		calendrierEvenements.renderEvent.subscribe(myAfterRenderHandler, calendrierEvenements, true);
		calendrierEvenements.cfg.setProperty("start_weekday", "1");
		calendrierEvenements.renderCellDefault = function(workingDate, cell) {
			cell.innerHTML = this.buildDayLabel(workingDate);
		};
		
		var themes = YAHOO.util.Dom.get("cal_themes");
		var regions = YAHOO.util.Dom.get("cal_regions");
		var cal_mois = YAHOO.util.Dom.get("cal_mois");
		var reset_research = jQuery("#reset-recherche a.reset");
		
		var buttonregions = YAHOO.util.Dom.get("radiothemes");
		var buttonthemes = YAHOO.util.Dom.get("radioregions");
		
		YAHOO.util.Event.addListener( buttonthemes, "change", refreshEventList);
		YAHOO.util.Event.addListener( buttonregions, "change", refreshEventList);
		
		if(themes != null){
			YAHOO.util.Event.addListener( themes, "change", refreshEventList);
			YAHOO.util.Event.addListener( themes, "keyup", refreshEventList);
		}
		if(regions != null){
			YAHOO.util.Event.addListener( regions, "change", refreshEventList);
			YAHOO.util.Event.addListener( regions, "keyup", refreshEventList);
		}
		YAHOO.util.Event.addListener( cal_mois, "change", updateCal); 
		YAHOO.util.Event.addListener( cal_mois, "keyup", updateCal);
		
		YAHOO.util.Event.addListener( reset_research, "click", resetRecherche);
		
		calendrierEvenements.render();
		loadShowMonthEvent();
	}
	
	YAHOO.util.History.onReady(function () {
		var currentState;
		// This is the tricky part... The onLoad event is fired when the user
		// comes back to the page using the back button. In this case, the
		// actual month that needs to be loaded corresponds to the last month
		// visited before leaving the page, and not the initial month. This can
		// be retrieved using getCurrentState:
		
		var obj = document.getElementById('showHideJavascript');
		obj.style.display = "block";
		
		currentState = YAHOO.util.History.getCurrentState("calendrier");
		initCalendar(currentState.replace("_", "/"));
	});
	
	// Initialize the browser history management library.
	try {
		YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
	} catch (e) {
		// The only exception that gets thrown here is when the browser is
		// not supported (Opera, or not A-grade) Degrade gracefully.
		initCalendar(initialCalendarState.replace("_", "/"));
	}
}


YAHOO.util.Event.onDOMReady(YAHOO.calendar.init);


