/**
 * Javascript common.
 *
 * @Copyright (c) 2009 travelsoft
 * @author emmanuel.sammut, minmin.wang
 * @version 1.0
 */

/**
 * protected jquery alias $.
 */
(function($){

  /**
   * document.Ready event.
   */
  $(function(){
  		/**
		 * PRODUCT PAGE
		 */
		 var retourUrl=null;
		 if($.cookies){
     			retourUrl=$.cookies.get("retourUrl");

   			}
			if(retourUrl!=null&&retourUrl!="undefined"&&retourUrl!=""){
		   	$('#head .returnTool').show();
			$('#head .returnTool a').attr("href",retourUrl);
			}else{
			$('#head .returnTool').hide();
			}
			$.cookies.del("retourUrl");

		/**
		 * Function syncSelect.
		 * Synchronise all others same select
		 *
		 * @param {Boolean} onchange [optional], apply change event if true.
		 * @return {jQuery} jQuery wrapper set
		 * @usage
		 *    $(".mySyncSelect").syncSelect();
		 *    $(".myClass1 select").syncSelect(true);
		 */
		$.fn.syncSelect = function(onchange){
			var slt = $(this);
			function sync(target){
				// get option value
				var val = $(target).val();
				// set all select
				$(slt.selector).val(val);
			}
			return onchange ? slt.change(function(evt){sync(evt.target)}) : sync(slt);
		}

		// Synchronise selectbox change into booking block
		$(".departureCity select").syncSelect(true);
		$(".departureDate select").syncSelect(true);
		$(".nbrAdultsPax select").syncSelect(true);
		$(".nbrChildrenPax select").syncSelect(true);
		$(".nbrBabiesPax select").syncSelect(true);
		$(".ageChild1 select").syncSelect(true);
		$(".ageChild2 select").syncSelect(true);
		$(".ageChild3 select").syncSelect(true);
		$(".ageChild4 select").syncSelect(true);
		$(".giftNumber select").syncSelect(true); // Simple product only

		// Change departure city
		$(".departureCity select").change(function(){
			fillSelectBoxDispo('slt_departureDate0', 'slt_departureCity0', dateArray, 'null');
			fillSelectBoxDispo('slt_departureDate1', 'slt_departureCity1', dateArray, 'null');
		});

		// Change number of children
		$(".nbrChildrenPax select").change(function(){
			var val = $(this).val();
			// Show or hide list element
			if(val === "0"){
				$(".ageChildrenSelection").slideUp();
			} else {
				$(".ageChildrenSelection")
						.find("li").hide().end()
						.find("li:lt(" + val + ")").show().end()
						.slideDown();
			}
		}).change();

		// Product menu, scroll to anchor with animation
		$("#productMenu a").click(function(){
			var target = $(this).attr("href");
			$.scrollTo(target, 800);
			return false;
		});

		// Link favorite
		$("#head .favoriteTool a").click(function(){
			var title = $(this).attr("title");
			var docTitle = document.title;
			var docURL = document.URL;
			if (document.all) { // IE
				window.external.AddFavorite(docURL, docTitle);
				return false;
			} else if (window.opera && window.print) { // Opéra
				$(this).attr("rel", "sidebar");
				$(this).attr("title", docTitle);
				$(this).click();
				$(this).attr("title", title);
			} else { // Others
				alert("Cette fonction n'est pas supportée sur votre navigateur.\nAppuyez sur CTRL+D ou Pomme+D sur Mac");
				return false;
			}
		});
		// Link print
		$("#head .printTool a").click(function(){
			window.open($(this).attr("href"),'printPopup', 'resizable=1, scrollbars=1, height=800, width=700');
			return false;
		});


		/**
		 * Function initDestiImage.
		 * Initialize a destination thumb and zoom images, add Class, add button zoom and close, add and set iframe if IE6.
		 */
		$.fn.initDestiImage = function(className){
			var pZoom = $(this)
			var img = pZoom.find("img");
			var thumb = pZoom.parent().find("p.image");
			if(navigator.userAgent.indexOf("MSIE 6") != -1){ // IE6
				pZoom.prepend("<iframe frameborder=\"0\" scrolling=\"no\" style=\"width:" + img.outerWidth() + "px; height:" + img.outerHeight() + "px;\position:absolute; top:0; left:0; z-index:-1;\"></iframe>");
			}
			thumb.addClass("thumb").append("<span>zoom</span>");
			pZoom.addClass("xZoom").append("<span>fermer</span>");
		}

		// Initialize destination image
		$("#destination .content p.imageZoom").initDestiImage();

		// Click on destination image
		$("#destination .content p.image").click(function(){
			$(this).parent().find("p.imageZoom").slideToggle();
		}).click();

		// Click on button close into destination image zoom
    	$("#destination .content p.imageZoom span").live("click", function(){
			$(this).parent("p.imageZoom").slideUp();
		});

		//Submit le formulaire pour le booking
    	$("#btnBooking0, #btnBooking1").click(function () {
    	  	$.setCookieSubmit();
    	  	if(retourUrl!=null&&retourUrl!="undefined"&&retourUrl!=""){
				$.cookies.set("retourUrl", retourUrl, {path : "/"});
			}
			$(this).parents("form").submit();
		 	return false;
    	});

    	//Submit le formulaire pour le booking PS
    	$("#btnCommander0, #btnCommander1").click(function () {
    	  	if(retourUrl!=null&&retourUrl!="undefined"&&retourUrl!=""){
				$.cookies.set("retourUrl", retourUrl, {path : "/"});
			}
		  	$(this).parents("form").submit();
		 	return false;
    	});

		//set Cookie de booking formulaire
		$.setCookieSubmit = function() {
			var departDispo=$(".departureDate select option:selected").attr("value");
			var departDispoArray=departDispo.split("-");
			var departDate=departDispoArray[0]+"/"+departDispoArray[1]+"/"+departDispoArray[2];
			var city=$(".departureCity select option:selected").attr("value");
			var adultsNumber=$(".nbrAdultsPax select option:selected").attr("value");
			var childrenNumber=$(".nbrChildrenPax select option:selected").attr("value");
			var babiesNumber=$(".nbrBabiesPax select option:selected").attr("value");
			var passengerInfo=adultsNumber+"&"+childrenNumber+"&"+babiesNumber;
			if(childrenNumber!="0") {
			   passengerInfo+="&";
			   for(var i=1;i<=childrenNumber;i++){
			       if(i>1)passengerInfo+="-";
	               passengerInfo+=$("#slt_ageChildren0_"+i+" option:selected").attr("value");
			   }
			}
			var date = new Date();
	        date.setTime(date.getTime() + (1 * 24 * 60 * 60 * 1000));
			$.cookies.set("departDate", departDate, {path : "/", expires: date});
			$.cookies.set("departCity", city, {path : "/", expires: date});
			$.cookies.set("passengerInfo", passengerInfo, {path : "/", expires: date});

		}

		$.daysElapsed = function(date1,date2) {
    		var difference = Date.UTC(date1.getYear(),date1.getMonth(),date1.getDate(),0,0,0)- Date.UTC(date2.getYear(),date2.getMonth(),date2.getDate(),0,0,0);
    		return difference/1000/60/60/24;
		}

		$.filterDate = function(departCity,selectDate) {
			var filteredDateArray = new Array();
			var index=0;
				for(var i=0;i<dateArray.length;i++){
			  		if(dateArray[i].depCityCode==departCity||departCity==""){
			  			var currentDateCode=dateArray[i].dateCode;
			  			var currentDateLabel=dateArray[i].dateLabel;
			  			var currentDateInOrder=currentDateLabel.split("/")[1]+"/"+currentDateCode.split("-")[0]+"/"+currentDateLabel.split("/")[2];
			  			var currentDate=new Date(currentDateInOrder);
			  			var difference=Math.abs($.daysElapsed(selectDate,currentDate));
			  			if(difference<=4){
							filteredDateArray[index++]=dateArray[i];
			  			}
			  		}
			  	}
		   return filteredDateArray;
		}
		$.selectFisrtDayOfMonth = function(departDate) {
			departDate=departDate.replace("/","-");
			var findOption=false;
			var selectedDate=$(".departureDate select option:selected").attr("value");
			$(".departureDate select option").each(function(i){
			var optionValue=$(this).attr("value");
			if(optionValue.indexOf(departDate)>-1&&!findOption){
				$(this).attr("selected", "selected");
				selectedDate=$(this).attr("value");
				findOption=true;
			}
			$(".departureDate select option[value='"+selectedDate+"']").attr("selected", "selected");//preselectionner la date
			})
		}

		//preselectionner le bloc reservation
		$.preselectResaForm = function() {
			var passengerInfo=	$.cookies.get("passengerInfo");
			if(passengerInfo){
				var passengerInfoArray=passengerInfo.split("&");
				var adultsNumber=passengerInfoArray[0];
				var childrenNumber=parseInt(passengerInfoArray[1]);
				var babiesNumber=passengerInfoArray[2];
				$(".nbrAdultsPax select option[value='"+adultsNumber+"']").attr("selected", "selected");
				$(".nbrChildrenPax select option[value='"+childrenNumber+"']").attr("selected", "selected");
				$(".nbrBabiesPax select option[value='"+babiesNumber+"']").attr("selected", "selected");
				$(".nbrChildrenPax select").change();
				if(childrenNumber>0){
					var childrenAges=	passengerInfoArray[3];
					var childrenAgesArray=childrenAges.split("-");
					for(var i=0;i<childrenAgesArray.length;i++){
						$(".ageChild"+(i+1)+" select option[value='"+childrenAgesArray[i]+"']").attr("selected", "selected");
					}
				}
			}

			var departCity=	$.cookies.get("departCity");
			var departDate=	$.cookies.get("departDate");
			var findCity=false;

			if(departCity!=null&&departCity!=""){//avec la ville dans le cookie
				var departCityArray=departCity.split(",");//la ville depart et sans transport
				for(var j=0;j<departCityArray.length;j++){
					$(".departureCity select option[value='"+departCityArray[j]+"']").attr("selected", "selected");//preselectionner la ville
					var selectedCity=$(".departureCity select option:selected").attr("value");
					if(departCityArray[j]==selectedCity){//trouver la ville dans les options
						findCity=true;
						fillSelectBoxDispo('slt_departureDate0', 'slt_departureCity0', dateArray, 'null');
						fillSelectBoxDispo('slt_departureDate1', 'slt_departureCity1', dateArray, 'null');
					}
					if(findCity&&departDate!=null&&departDate!=""){//trouver la ville dans les options et avec la date dans le cookie
						var departDateArray=departDate.split("/");
						if(departDateArray.length==3){//avec la date exacte dans le cookie
							var departDateInOrder=parseFloat(departDateArray[1])+"/"+parseFloat(departDateArray[0])+"/"+parseFloat(departDateArray[2]);

							var selectDate=new Date(departDateInOrder);
							var filteredDateArray=$.filterDate(departCityArray[j],selectDate);//filtrer les options date(plus ou moins 4 jours
							if(filteredDateArray.length>0){//chercher la date avec le prix moins cher dans l'interval
								var minPrice=0;
								var selectedDispo="";

								for(var i=0;i<filteredDateArray.length;i++){
									var currentPrice=parseInt(filteredDateArray[i].priceLabel.replace(" &euro;",""));
									if(i==0||currentPrice<minPrice){
										minPrice=currentPrice;
										selectedDispo=filteredDateArray[i].keyBox;
									}
								}
								$(".departureDate select option[value='"+selectedDispo+"']").attr("selected", "selected");//preselectionner la date
							}else{//chercher le premier jour du mois
								departDate=departDateArray[1]+"/"+departDateArray[2];
								$.selectFisrtDayOfMonth(departDate);
							}
						}else if(departDateArray.length==2){//avec le mois dans le cookie
							$.selectFisrtDayOfMonth(departDate);

						}
					}
				}
			}
			if((!findCity||departCity==null||departCity=="")&&departDate!=null&&departDate!=""){//pas trouver la ville dans les options ou sans la ville dans le cookie
				var departDateArray=departDate.split("/");
				if(departDateArray.length==3){//avec la date exacte dans le cookie
					var departDateInOrder=parseFloat(departDateArray[1])+"/"+parseFloat(departDateArray[0])+"/"+parseFloat(departDateArray[2]);

					var selectDate=new Date(departDateInOrder);
					var filteredDateArray=$.filterDate("",selectDate);//filtrer les options date(plus ou moins 4 jours
					if(filteredDateArray.length>0){//chercher la date avec le prix moins cher dans l'interval
						var minPrice=0;
						var selectedDispo="";
						var selectedCity="";
						for(var i=0;i<filteredDateArray.length;i++){
							var currentPrice=parseInt(filteredDateArray[i].priceLabel.replace(" &euro;",""));
							if(i==0||currentPrice<minPrice){
								minPrice=currentPrice;
								selectedDispo=filteredDateArray[i].keyBox;
								selectedCity=filteredDateArray[i].depCityCode;
							}
						}
						$(".departureCity select option[value='"+selectedCity+"']").attr("selected", "selected");//preselectionner la ville
						fillSelectBoxDispo('slt_departureDate0', 'slt_departureCity0', dateArray, 'null');
						fillSelectBoxDispo('slt_departureDate1', 'slt_departureCity1', dateArray, 'null');
						$(".departureDate select option[value='"+selectedDispo+"']").attr("selected", "selected");//preselectionner la date
					}else{//chercher le premier jour du mois
						departDate=departDateArray[1]+"/"+departDateArray[2];
						$.selectFisrtDayOfMonth(departDate);
					}
				}else if(departDateArray.length==2){//avec le mois dans le cookie
					$.selectFisrtDayOfMonth(departDate);
				}
			}
		}
		$.preselectResaForm();

  });

})(jQuery);

/**
 * debug tools
 */
function info(param){
  if(window.console && window.console.info){
    window.console.info(param);
  }
}

/*****************************************************/
/** Class contains the disponibilities departure city */
/*****************************************************/
/**
* Constructor
*/
function DepCity(depCityCode, depCityLabel) {
    this.depCityCode = depCityCode;
    this.depCityLabel = depCityLabel;
}


/***************************************************************************/
/** Class contains disponibilities date and price for city and month given */
/***************************************************************************/
/**
* Constructor
*/
function DateDispo(depCityCode, dateCode, dateLabel, priceLabel, keyBox) {
    this.depCityCode = depCityCode;
    this.dateCode = dateCode;
    this.dateLabel = dateLabel;
    this.priceLabel = priceLabel;
    this.keyBox = keyBox;
    var splitKey = keyBox.split("-");
    this.nbDays = splitKey[3];
    this.nbNigths = splitKey[4];
}

/**
* Methode toString
*/
DateDispo.prototype.toString = function() {
    var decodePrice = this.priceLabel.replace(/&euro;/,"€");
    return this.dateLabel + " à partir de " + decodePrice + " - "
           + this.nbDays + " j / " + this.nbNigths + " n";
}
/**
* Methode stringInValue
*/
DateDispo.prototype.stringInValue = function() {
    return  this.keyBox;
}
/******************************************/
/**
* Remplissage de la select box des dispos sur la fiche produit.
* @param dispoSelectBoxName dispo select box name
* @param citySelectBoxName city select box name
* @param dateArray array of all js dispos objects
* @param selectedDispo option dispo to select (from salesprocess)
*/
function fillSelectBoxDispo(dispoSelectBoxName, citySelectBoxName, dateArray, selectedDispo) {

    // On recupere le code de la ville selectionnée
    var selectedDepCityCode = document.getElementById(citySelectBoxName).options[document.getElementById(citySelectBoxName).selectedIndex].value;

    var dispoSelectBoxElt = document.getElementById(dispoSelectBoxName);

    // Suppression des anciennes Options
    dispoSelectBoxElt.options.length = 0;

    // Ajout des nouvelles Options
    var j = 0;
    for(var i = 0; i < dateArray.length; i++) {
        if (dateArray[i].depCityCode == selectedDepCityCode) {
            dispoSelectBoxElt.options[j] =
                        new Option(dateArray[i].toString(),
                                   dateArray[i].stringInValue());
            j++;
        }
    }

}


