/*--------------------------------------------------------------------------------*/
/*                                      SEARCH                                    */
/*--------------------------------------------------------------------------------*/


/**
 * <code>submitKwSearch</code><br>
 * Submits a key word search.
 */
function submitKwSearch() {
  var dkw = $("#dkw").get(0);
  if (dkw.value != dkw.defaultValue) {
    submitSearch($("#kwSearch"));
  }
  return false;
}


/**
 * <code>submitSearch</code><br>
 * Submits the search. The engine to load is taken from
 * the class of the element parameter.
 * @param element : the element used to start the search.
 */
function submitSearch(element) {

  var url = "";
  var pageName = "";
  var countryName = "";

  if (element.is(".engineSearch")) {

    var voyageType = $("#TypeDeVoyage").val()
    url += "c.TDV=" + voyageType;

     var theme = $("#theme").val();
     var themeName = $("#theme").attr("name");
     if(theme&&theme!==""){
       url += "&"+themeName+"=" + theme;

     }
     if ($("#cbx_transport").attr('checked')) {
       url += "&dpci=XXX";
     }
     else {
       url += "&dpci=" + $("#cityStart").val();
     }

    if ($("#dmy").val() != "") {
      url += "&dmy=" + $("#dmy").val();
      if ($("#dd").val() != "") {
        url += "&dd="+ $ ("#dd").val();
      }
      if ($("#flexibility").val() != "") {
        url += "&aj=" + $("#flexibility").val();
      }
    }

    url += "&mmd=" + $("#duration").val();

    if ($("#budget").val() != "") {
      url += "&mmp=" + $("#budget").val();
    }
    if ($("#typeHebergement").val()&&$("#typeHebergement").val() !== "") {
      url += "&c.THCLU=" + $("#typeHebergement").val();
    }

    if ($("#VilleDestination").length > 0 && $("#VilleDestination").val() != "") {
      url += "&c.DT" + ((voyageType == "" || voyageType == "CLU") ? "SEJ" : voyageType) + "=" + $("#VilleDestination").val();
    } else if ($("#PaysDestination").length > 0 && $("#PaysDestination").val() != "") {
      url += "&c.DT" + ((voyageType == "" || voyageType == "CLU") ? "SEJ" : voyageType) + "=" + $("#PaysDestination").val();
    }

    if ($("#DureeVol").length > 0 && $("#DureeVol").val() != "" && !/entre/.test($("#DureeVol").val())) {
      url += "&c.DDV=" + $("#DureeVol").val();
    }

    if ($("#Decalage").length > 0 && $("#Decalage").val() != "" && !/entre/.test($("#Decalage").val())) {
      url += "&c.DECHO=" + $("#Decalage").val();
    }

    if ($("#SeaTemp").length > 0 && $("#SeaTemp").val() != "" && !/entre/.test($("#SeaTemp").val())) {
      url += "&c.TEME=" + $("#SeaTemp").val();
    }

    if ($("#Promotion").is(":checked")) {
      url += "&pro=1";
    }

    $("input.star:checked").each(function() {
      if(this.checked) {
          url += "&" + this.name + "=" + mapRatingToMark(this.value);
      }
    });

    pageName = $.removeInvalidUrlChars($("#TypeDeVoyage option:selected").text().toLowerCase());
    if (pageName == "indifferent") {
      if ($("#Promotion").is(":checked")) {
        pageName = "promotions"
      } else {
        pageName = "voyage";
      }
    }

    var countryName = $.removeInvalidUrlChars($("#PaysDestination option:selected").text().toLowerCase());
    if (countryName == "" || countryName == "indifferent") {
      countryName = "pays";
    }

  } else {

    var tdv = $("#dkwTDV").val()
    url += "c.TDV=" + tdv;

    pageName = "voyage";
    if (tdv == "SEJ") {
      pageName = "sejour";
    } else if (tdv == "CIR") {
      pageName = "circuit";
    } else if (tdv == "LOC") {
      pageName = "location";
    } else if (tdv == "BIE") {
      pageName = "thalasso";
    } else if (tdv == "CLU") {
      pageName = "club";
    }

    countryName = "pays";

  }

  if (element.is(".kwSearch")) {
    url += "&dkw=" + $.removeInvalidUrlChars($("#dkw").val().replace(/\s/, '+'));
  }

  var trackingInfo = element.data("trackingInfo");
  if (trackingInfo && trackingInfo.xtconf) {
    url += "&xtconf=" + trackingInfo.xtconf;
  }
   //test if has number in countryName
   var regCountry = new RegExp("([\\w]+-[\\d]+)");
   var filterRegCountry = new RegExp("([\\w]+)");
   var countryName = regCountry.test(countryName) ? filterRegCountry.exec(countryName)[1] : countryName;
  var finalUrl = "/" + pageName + "/" + countryName + "/" + url;
  window.location = finalUrl;
  updateHistory(url, finalUrl);
}


/**
 * <code>mapRatingToMark</code><br>
 * Get's the minimum mark corresponding to the rating
 * @param rate : the given rate.
 */
function mapRatingToMark(rate) {
  var mark = 0;
  if (rate == 1) {
    mark = 8;
  } else if (rate == 2) {
    mark = 10;
  } else if (rate == 3) {
    mark = 11;
  } else if (rate == 4) {
    mark = 14;
  } else if (rate == 5) {
    mark = 17;
  }
  return mark;
}


/*--------------------------------------------------------------------------------*/
/*                                      LOADING                                   */
/*--------------------------------------------------------------------------------*/


function loadSearchEngine(queryString) {
  $("#searchEngine")
    .html("<img src=\"/csvweb/images/ajax-loader-big.gif\" style=\"padding: 50px 0 50px 80px\" alt=\"Chargement...\" title=\"Chargement...\" />")
    .load(queryString, function() {
      initSearchEngine();
      var trackingInfo = $(this).data("trackingInfo");
      loadDestinationEngine(queryString.replace("engineLeft", "engineDestination"));
      if (trackingInfo && trackingInfo.callback !== null) {
          trackingInfo.callback.apply();
      }
    });
}


function loadDestinationEngine(queryString) {
  if ($("#destinationEngine").length > 0) {
    $("#destinationEngine")
      .html("<img src=\"/csvweb/images/ajax-loader-big.gif\" style=\"padding: 50px 0 50px 80px\" alt=\"Chargement...\" title=\"Chargement...\" />")
      .load(queryString, function() {
        initDestinationEngine(queryString);
        initDestinationValues(queryString);
      });
  } else {
    $("#PaysDestination").change(function() {
      if (this.value === ""||this.value.indexOf(".")===-1) {
        $("#VilleDestination").attr("disabled", true).attr("selectedIndex", 0);
      } else {
        $("#VilleDestination").attr("disabled", false).html("<option value=\"\" selected=\"selected\">Indifférent</option>");
        $("#villeoptions option").filter("[value^=" + this.value + "]").clone().appendTo("#VilleDestination");
        var cityLabel1=$("#destinationEngine").find("fieldset:last").find("legend");
        var cityLabel2=$(".rm-affiner-1").find("fieldset:last").find("legend");
        if(this.value==="EURO.FRAN"){
            cityLabel1.html("Région");
            cityLabel2.html("Région");
        }else{
            cityLabel1.html("Ville");
            cityLabel2.html("Ville");
        }
      }
    });
    initDestinationValues(queryString);
  }
}

/*--------------------------------------------------------------------------------*/
/*                                      INIT                                      */
/*--------------------------------------------------------------------------------*/



function initSearchEngine() {


  var dpci=$("#cityStart").val(),
  url=location.href;
  if (url.indexOf("dpci=XXX") == -1) {
    $("#cbx_transport").attr('checked',false);
  }

  if($("#TypeDeVoyage").val() == "LOC"){
    $("#cbx_transport").attr('checked',true);
  }
   var isNoTransport = $("#cbx_transport").attr('checked');

  $(".calendar")
    .focus(function(){ this.blur(); })
    .datepicker({
      buttonImageOnly: true,
      firstDay: 1,
      highlightWeek: true,
      minDate: 0,
      dateFormat: "dd/mm/yy",
      dayNamesMin: ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"],
      monthNames: ["Janvier", "F&eacute;vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao&ucirc;t", "Septembre", "Octobre", "Novembre", "D&eacute;cembre"]
    });

  $("input.star").rating({cancel: "Annuler"});

  $("#date").change(function() {
    setDateFields();
    $("#search").find(".search-box").hide();
    initMeteoEngine(prepareSubEngineParameters());
  });

  $("#TypeDeVoyage").change(function(){
    loadSearchEngine(prepareSearchEngineUrl());
  });

  // Set default departure city
  if ($.cookies && $.cookies.get("departCity") !== null && !(/dpci=/.test(location.pathname)) && !$("#TypeDeVoyage").val() == "LOC") {
    $("#cityStart option[value=" + $.cookies.get("departCity") + "]").attr("selected", "selected");
  }

  // Disabled city start select box when is no transport
  if(isNoTransport){
    $("#cityStart").attr('disabled', true);
  }

  // Added "click" event for disabled city start select box.
  $('#cbx_transport').click(function(){
    isNoTransport = $("#cbx_transport").attr('checked');
    $("#cityStart").attr('disabled', isNoTransport);
    isNoTransport = !isNoTransport;
  });

}


function initDestinationEngine(queryString) {
  $("#PaysDestination").change(function() {
    if (this.value === ""||this.value.indexOf(".")==-1) {
      $("#VilleDestination").attr("disabled", true).attr("selectedIndex", 0);
    }  else {
      $("#VilleDestination").attr("disabled", false).html("<option value=\"\" selected=\"selected\">Indifférent</option>");
      $("#villeoptions option").filter("[value^=" + this.value + "]").clone().appendTo("#VilleDestination");
      var cityLabel1=$("#destinationEngine").find("fieldset:last").find("legend");
      var cityLabel2=$(".rm-affiner-1").find("fieldset:last").find("legend");
      if(this.value==="EURO.FRAN"){
          cityLabel1.html("Région");
          cityLabel2.html("Région");
      }else{
          cityLabel1.html("Ville");
          cityLabel2.html("Ville");
      }
    }
    $("#search").find(".search-box").hide();
    var parameters = prepareSubEngineParameters();
    initMeteoEngine(parameters);
    initFlightTimeEngine(parameters);
    initTimeOffsetEngine(parameters);
  });

  $("#search")
    .find(".close").live("click", function() {
      $(this).parents(".search-box:first").hide();
      return false;
    }).end()
    .find(".cancel").live("click", function() {
      $(this).parents(".search-box:first").hide();
      return false;
    }).end()
    .find(".languette").live("click", function() {
      $(this).parent().toggle().siblings(".search-box").hide();
    }).end()
    .find(".submit").live("click", function() {
      $(this).parents(".search-box:first").hide();
      loadDestinationEngine(prepareDestinationEngineUrl());
      return false;
    });

}


function initMeteoEngine(parameters) {
  $("#search-btn-meteo")
    .unbind("click")
    .one("click", function() {
      $("#meteoshow")
        .html("<p class=\"slider\"><img src=\"/csvweb/images/ajax-loader-big.gif\" alt=\"Chargement...\" title=\"Chargement...\" /></p>")
        .load("/elements/engineMeteo.jsp" + parameters, function() {initMeteoBox(parameters)});
    })
    .click(function() {
      $("#meteobox").toggle().siblings(".search-box").hide();
      return false;
    });
}


function initFlightTimeEngine(parameters) {
  $("#search-btn-flight")
    .unbind("click")
    .one("click", function() {
      $("#flytimeshow")
        .html("<p class=\"slider\"><img src=\"/csvweb/images/ajax-loader-big.gif\" alt=\"Chargement...\" title=\"Chargement...\" /></p>")
        .load("/elements/engineFlightTime.jsp" + parameters, function() {initFlightTimeBox(parameters)});
    })
    .click(function() {
      $("#flytimebox").toggle().siblings(".search-box").hide();
      return false;
    });
}


function initTimeOffsetEngine(parameters) {
  $("#search-btn-time")
    .unbind("click")
    .one("click", function() {
      $("#timeshow")
        .html("<p class=\"slider\"><img src=\"/csvweb/images/ajax-loader-big.gif\" alt=\"Chargement...\" title=\"Chargement...\" /></p>")
        .load("/elements/engineTimeOffset.jsp" + parameters, function() {initTimeOffsetBox(parameters)});
    })
    .click(function() {
      $("#timebox").toggle().siblings(".search-box").hide();
      return false;
    });
}


function initDestinationValues(queryString) {
  var regType = new RegExp(/c\.TDV=([\w]+)/);
  var type = regType.test(queryString) ? regType.exec(queryString)[1] : "SEJ";
  var regCity = new RegExp("c\\.DT" + type + "=([\\w]+\\.[\\w]+\\.[\\w]+)");
  var city = regCity.test(queryString) ? regCity.exec(queryString)[1] : "";
  var regCountry = new RegExp("c\\.DT" + type + "=([\\w]+\\.[\\w]+)");
  var country = regCountry.test(queryString) ? regCountry.exec(queryString)[1] : "";
  if(city===""&&country===""){
   regCountry = new RegExp("c\\.DT" + type + "=([\\w]+)");
   country = regCountry.test(queryString) ? regCountry.exec(queryString)[1] : "";
  }
  $("#PaysDestination").find("option[value=" + country + "]").attr("selected", "selected").change();
  $("#VilleDestination").find("option[value=" + city + "]").attr("selected", "selected");
}



/*--------------------------------------------------------------------------------*/
/*                                  BOXES                                         */
/*--------------------------------------------------------------------------------*/



function initMeteoBox(parameters) {
  var dmy = /c.TEME=([\d]+)/.exec(parameters)[1];
  $("#dm").val(dmy);
  $("#meteobox div.topbox h3").text("Météo - " + $("#teme").find("option[value=" + dmy + "]").text());
  if (!/c\.TDV=/.test(parameters)) {
    var minVal = 0;
    var maxVal = parseInt($("#teme").find("option[value^=" + dmy + ".]:last").val().split("-")[1]);
    if ($("#SeaTemp").length > 0 && $("#SeaTemp").val() != "") {
      var criteria = $("#SeaTemp").val().split(",");
      minVal = criteria[0].split(".")[1].split("-")[0];
      maxVal = criteria[criteria.length - 1].split("-")[1];
    }
    $("#seatemp-range").slider({
      range: true,
      min: 0,
      max: parseInt($("#teme").find("option[value^=" + dmy + ".]:last").val().split("-")[1]),
      step: 5,
      values: [minVal, maxVal],
      slide: function(event, ui) {
        $("#SeaTempDisplay").val("entre "  + ui.values[0] + "°C"  + " et " + ui.values[1]+ "°C");
      }
    });
    $("#SeaTempDisplay").val("entre "  + minVal + "°C"  + " et " + maxVal + "°C");
  }
}


function initFlightTimeBox(parameters) {
  if (!/c\.TDV=/.test(parameters)) {
    var minInd = 0;
    var maxInd = $("#ddv option").length;
    if ($("#DureeVol").length > 0 && $("#DureeVol").val() != "") {
      var criteria = $("#DureeVol").val().split(",");
      maxInd = $("#ddv option").index($("#ddv").find("option[value=" + criteria[criteria.length - 1] + "]").get(0)) + 1;
      minInd = maxInd - criteria.length;
    }
    $("#flytime-range").slider({
      range: true,
      min: 0,
      max: $("#ddv option").length,
      values: [minInd, maxInd],
      slide: function(event, ui) {
        var min = ui.values[0] == 0 ? 0 : $("#ddv option").get(ui.values[0] - 1).value.substring(1);
        var max = ui.values[1] == 0 ? 0 : $("#ddv option").get(ui.values[1] - 1).value.substring(1);
        $("#DureeVolDisplay").val("entre "  + min + "h"  + " et " + max + "h");
      }
    });
    $("#DureeVolDisplay").val("entre " + (minInd == 0 ? "0" : $("#ddv option").get(minInd - 1).value.substring(1)) + "h et " + (maxInd == 0 ? "0" : $("#ddv option").get(maxInd - 1).value.substring(1)) + "h");
  }
}


function initTimeOffsetBox(parameters) {
  if (!/c\.TDV=/.test(parameters)) {
    var step = eval(parseInt($("#decho").find("option:last").val()) - parseInt($("#decho").find("option:last").prev().val()));
    var minVal = 0;
    var maxVal = parseInt($("#decho").find("option:last").val());
    if ($("#Decalage").length > 0 && $("#Decalage").val() != "") {
      var criteria = $("#Decalage").val().split(",");
      minVal = parseInt(criteria[0]);
      maxVal = parseInt(criteria[criteria.length - 1]);
    }
    $("#time-range").slider({
      range: true,
      min: 0,
      max: $("#decho").find("option:last").val(),
      step: step,
      values: [minVal, maxVal],
      slide: function(event, ui) {
        $("#DecalageDisplay").val("entre +/-"  + ui.values[0] + "h"  + " et +/-" + ui.values[1]+ "h");
      }
    });
    $("#DecalageDisplay").val("entre +/-" + minVal + "h"  + " et +/-" + maxVal + "h");
  }
}



/*--------------------------------------------------------------------------------*/
/*                                  URL HANDLING                                  */
/*--------------------------------------------------------------------------------*/



/**
 * <code>prepareSubEngineParameters</code><br>
 * Prepares the parameters to send to the destination engines,
 * namely time offset, flight time and meteo engines.
 */
function prepareSubEngineParameters() {
  var tdv = $("#TypeDeVoyage").val() == "" ? "SEJ" : $("#TypeDeVoyage").val();
  var parameters = "";
  if ($("#VilleDestination").val() != "") {
    parameters += "?c.TDV=" + tdv + "&c.DT" + tdv + "=" + $("#VilleDestination").val();
  } else if ($("#PaysDestination").val() != "") {
    parameters += "?c.TDV=" + tdv + "&c.DT" + tdv + "=" + $("#PaysDestination").val();
  }
  if ($("#dmy").val() != "") {
    parameters += (parameters.length == 0 ? "?c.TEME=" : "&c.TEME=") + parseInt($("#dmy").val().split("/")[0]);
  } else {
    var currentDate = new Date();
    parameters += (parameters.length == 0 ? "?c.TEME=" : "&c.TEME=") + parseInt(currentDate.getMonth() + 1);
  }
  return parameters;
}


function prepareSearchEngineUrl() {
  var url = "/elements/" + $("#TypeDeVoyage").attr("class") + ".jsp";
  url += prepareCriteriaUrl();
  url += prepareMeteoUrl();
  url += prepareFlightTimeUrl();
  url += prepareTimeOffsetUrl();
  return url;
}


function prepareDestinationEngineUrl() {
  var url = "/elements/engineDestination.jsp";
  url += prepareCriteriaUrl();
  url += prepareMeteoUrl();
  url += prepareFlightTimeUrl();
  url += prepareTimeOffsetUrl();
  return url;
}


function prepareCriteriaUrl() {
  var type = $("#TypeDeVoyage").val();
  var url = "?c.TDV=" + type;
  if($("#engine").val() != ""){
     url += "&engine=" +$("#engine").val();
  }
  if ($("#VilleDestination").val() != "") {
    url += "&c.DT" + type + "=" + $("#VilleDestination").val();
  } else if ($("#PaysDestination").val() != "") {
    url += "&c.DT" + type + "=" + $("#PaysDestination").val();
  }
  if ($("#dmy").val() != "") {
    url += "&dmy=" + $("#dmy").val();
    if ($("#dd").val() != "") {
      url += "&dd="+ $ ("#dd").val();
    }
    if ($("#flexibility").val() != "") {
      url += "&aj=" + $("#flexibility").val();
    }
  }
  if ($("#Promotion").is(":checked")) {
    url += "&pro=1"
  }
  return url;
}


function prepareMeteoUrl() {
  var url = "";
  var dmy = $("#dm").val();
  if ($("#SeaTempDisplay").length > 0) {
    var ipt_teme = $("#SeaTempDisplay").get(0);
    var defaultValue = $("#teme").find("option[value^=" + dmy + ".]:last").length > 0 ? "entre "  + "°C et " + $("#teme").find("option[value^=" + dmy + ".]:last").val() + "°C" : ipt_teme.defaultValue;
    if (ipt_teme && ipt_teme.value != defaultValue) {
      var regTeme = new RegExp(/entre ([\d]+)°C et ([\d]+)°C/);
      var teme = regTeme.exec(ipt_teme.value);
      url += "&c.TEME=" + $.grep($.map($("#teme option[value^=" + dmy + ".]"), function(elt) { return elt.value; }), function(val) {
          var range = /[\d]+\.([\d]+)\-([\d]+)/.exec(val);
          return parseInt(range[1]) >= parseInt(teme[1]) && parseInt(range[2]) <= parseInt(teme[2]);
        }).join(",");
    }
  } else if ($("#SeaTemp").val() != "") {
    url += "&c.TEME=" + $("#SeaTemp").val();
  }
  return url;
}


function prepareFlightTimeUrl() {
  var url = "";
  if ($("#DureeVolDisplay").length > 0) {
    var ipt_ddv = $("#DureeVolDisplay").get(0);
    var defaultValue = $("#ddv").find("option:last").length > 0 ? "entre 0h et " + $("#ddv").find("option:last").val().substring(1) + "h" : ipt_ddv.defaultValue;
    if (ipt_ddv && ipt_ddv.value != defaultValue) {
      var regDdv = new RegExp(/entre ([\d]+)h et ([\d]+)h/);
      var ddv = regDdv.exec(ipt_ddv.value);
      url += "&c.DDV=" + $.grep($.map($("#ddv option"), function(elt) { return elt.value; }), function(val) {
        return parseInt(val.substring(1)) > parseInt(ddv[1]) && parseInt(val.substring(1)) <= parseInt(ddv[2]);
      }).join(",");
    }
  } else if ($("#DureeVol").val() != "") {
    url += "&c.DDV=" + $("#DureeVol").val();
  }
  return url;
}


function prepareTimeOffsetUrl() {
  var url = "";
  if ($("#DecalageDisplay").length > 0) {
    var ipt_decho = $("#DecalageDisplay").get(0);
    var defaultValue = $("#decho").find("option:last").length > 0 ? "entre +/-0h"  + " et +/-" + $("#decho").find("option:last").val() + "h" : ipt_decho.defaultValue;
    if (ipt_decho && ipt_decho.value != defaultValue) {
      var regDecho = new RegExp(/entre \+\/\-([\d]+)h et \+\/\-([\d]+)h/);
      var decho = regDecho.exec(ipt_decho.value);
      url += "&c.DECHO=" + $.grep($.map($("#decho option"), function(elt) { return elt.value; }), function(val) {
          return parseInt(val) >= parseInt(decho[1]) && parseInt(val) <= parseInt(decho[2]);
        }).join(",");
    }
  } else if ($("#Decalage").val() != "") {
    url += "&c.DECHO=" + $("#Decalage").val();
  }
  return url;
}



/*--------------------------------------------------------------------------------*/
/*                                  OTHER                                         */
/*--------------------------------------------------------------------------------*/


function setDateFields() {
  var value = $("#date").val();
  if (!(/Invalid|NaN/.test(new Date(value.substring(6, 10),value.substring(3, 5),value.substring(0, 2))))) {
    $("#dd").val(value.substring(0, 2));
    $("#dmy").val(value.substring(3, 10));
    $("#flexibility").removeAttr("disabled");
  } else {
    $("#date").val("jj/mm/aaaa");
    $("#dd").val("");
    $("#dmy").val("");
    $("#flexibility").attr("disabled", "disabled");
  }
}




$(function() {

  // Keyword Search box
  $("#dkw").labelValue("#333");


  // Search buttons
  $("#engineSearch").live("click", function() { submitSearch($(this)); return false; });
  $("#kwSearch").live("click", submitKwSearch);


  // Agents search refine by country
  $("#opdt").click(function() {
    $(".rm-list")
      .html("<img src=\"/csvweb/images/ajax-loader-big.gif\" style=\"padding: 50px 0 50px 90px\" alt=\"Chargement...\" title=\"Chargement...\" />")
      .load(this.href + "&c.DTSEJ=" + $("#PaysDestination").val(), function(){
        $.scrollTo("div.rm-topbar");
        loadFavorites();
      });
    return false;
  });

});

