/** Simple Search
 *
 *
 **/
var SimpleSearch = function () {
  this.initialize(this, arguments);
};
SimpleSearch.prototype = {
  constructor: SimpleSearch.constructor,
  initOptions: function (options) { //parametres par defaultdefaults params that can be declareds when create object
    this.options = { //parametres application
      containerId: 'simpleSearch',
      //id du conteneur HTML, pas utile pour l'instant
      travelNumberId: 'search_travelNumber',
      travelTypeRadiosQuery: '.radioList input[type=radio]',
      departurePlaceId: 'search_villedepart',
      departureDatePickerId: 'search_depart_datepicker',
      destinationPlaceId: 'search_destination',
      departureDateId: 'search_depart',
      nbAdultsId: 'search_nb_adult',
      nbEnfantsId: 'search_nb_child',
      budgetId: 'search_budget',
      plusdeCriteresId: 'search_plusdeCriteres',
      simpleSearchErrorMsgId: 'search_errormsg'
    };
    for (var i in options) {
      this.options[i] = options[i];
    }
  },
  initVariables: function (travelType) { //all public properties are declared here
    // properties
    // view : objet contenant une reference sur tous les elements de la vue (code HTML)
    this.view = {
      form: null,
      //reference au formulaire
      travelTypeRadios: [],
      //radios boutons du type du voyage
      departurePlace: null,
      //select avec de la ville de depart
      destinationPlace: null,
      //select de la ville de destination
      departureDate: null,
      //input de la date de depart
      departureDatePicker: null,
      //lien clicable pour afficher le datepicker
      nbAdults: null,
      //select du nombre d'adults
      nbEnfants: null,
      //select du nombre d'enfants
      budget: null,
      //select budget
      simpleSearchErrorMsg: null,
      //div des messages d'erreur
      plusdeCriteres: null,
      travelNumber: null //elements span contenant le nombre de voyages
    };
    this.model = {
      searchConfig: {},
      //objet initialisé via un fichier JSon chargé en ajax;
      searchDatas: {},
      //idem
      searchQuery: { //searchQuery : objet contenant les données de recherche, ces données sont mises à jour dès qu'un input est mis à jour
        travelType: travelType[0] ? travelType[0] : null,
        //type de sejour, voyage, vols secs, sejours...
        departurePlace: '',
        //endroit de depart, ville de depart en principe
        destinationPlace: '',
        //destination d'arrivée, c'est un pays ici
        departureDate: '',
        //date de depart, format JJ/MM/AAAA
        nbAdults: 0,
        //nb adultes
        nbEnfants: 0,
        //nb enfants
        budget: 0 //budget (min-max)
      },
      currentTravelText: '' //nom du voyage en cours, dependra du label du radio coché
    };
    this.destinationSelectOptions = {}; // hashmap contenant la list des options du select de destination
  },
  // constructor
  initialize: function (options, travelType) {
    this.initOptions(options);
    this.initVariables(travelType); // set variables
    this.view.form = $('#' + this.options.containerId); // desactivation de tous les champs du formulaire
    //this.view.form.find('input[name="search[hasJs]"]').val(true);
    this.view.form.find('input,select').attr('disabled', 'disabled'); //this.model.searchQuery = SearchManager.searchQuery;
    var _this = this;

    SearchManager.getDatas(['searchConfig', 'searchDatasSimple'], function (datas) { //sets datas
      _this.model.searchConfig = datas.searchConfig;
      _this.model.searchDatas = datas.searchDatasSimple;
      _this.model.searchQuery.searchId = _this.model.searchDatas.searchId; //reactivation des champs
      _this.view.form.find('input,select').removeAttr('disabled'); //init le reste de l'application :
      _this.initView();
      _this.initHandlers();
      _this.initFromCookie();
      _this.refreshView();

      //fix model by executing selects events
      _this.view.departurePlace.change();
      _this.view.destinationPlace.change();
    });
  },
  // methods
  initView: function () {
    var _this = this,
    i;
    var v = this.view; //recuperation des champs dans un objet leur faisant référence (this.view)
    //raccourci pour initialiser plusieurs champs via leur Id
    var idsList = [];
    for (i in this.options) {
      if (i.match(/Id$/)) {
        idsList.push(i);
      }
    }

    var elmName;
    for (i = 0; i < idsList.length; i++) {
      elmName = idsList[i].replace(/Id$/, '');
      v[elmName] = $('#' + this.options[idsList[i]]);

      if(elmName != 'departureDate' && v[elmName] && v[elmName].val()) {
        _this.model.searchQuery[elmName] = v[elmName].val();
      }
    }

    v.travelTypeRadios = this.view.form.find(this.options.travelTypeRadiosQuery); // sauvegarde des options du destination dans une hashmap

    //SELECT THE RADIO TYPE
    v.travelTypeRadios.each(function () {
      if ((this.checked || this.value == _this.model.searchQuery.travelType) && this.value != "weekend") {
        _this.model.searchQuery.travelType = this.value;
        $(this).click();
      }
    });

    if(!this.model.searchQuery.travelType)
    {
      var input = v.travelTypeRadios.eq(0);
      this.model.searchQuery.travelType = input.val();
      input.click();
    }

    //this.initDestinationSelector();
    v.travelNumber = $('#' + this.options.travelNumberId);
    v.plusdeCriteres.click(function (e) {
      e.preventDefault();
      _this.submitForm();
    });
    v.plusdeCriteres.show();
  },
  // init des evenements sur les champs
  initHandlers: function () {
    var _this = this; //boutons radios
    this.view.travelTypeRadios.parent('li').click(function (e)  {
      if(_this.model.searchQuery.travelType == $(this).find('input').val()) return ;
      _this.model.searchQuery.travelType = $(this).find('input').val();
      _this.model.currentTravelText = $(this).find('label').html().toLowerCase();
      _this.inputChanged();
      e.preventDefault();
      _this.refreshView();
    }); //init generique pour plusieurs selects
    this.initChangeHandlerForSelects(['destinationPlace', 'budget']); //date de depart
    this.view.departureDatePicker.click(function (e) {
      e.preventDefault();
      new DatePicker().show(this, {
        destField: 'search_depart',
        forbiddenDays: {
          period: ['before today+2']
        },
        dateChoosen: function (date) {
          _this.view.departureDate.change();
        }
      });
    });
    this.view.departureDate.change(function (e) {
      if(_this.model.searchQuery.departureDate == $(this).val()) return ;
      console.log($(this).val());
      _this.model.searchQuery.departureDate = $(this).val();
      _this.inputChanged();
    }); // ville de depart
    this.view.departurePlace.change(function (e) {
      if(_this.model.searchQuery.departurePlace == $(this).val()) return ;
      _this.model.searchQuery.departurePlace = $(this).val(); //_this.filterSelectDestination();
      _this.inputChanged();
    }); //nb adults
    this.view.nbAdults.change(function (e) {
      if(_this.model.searchQuery.nbAdults == $(this).val()) return ;
      _this.model.searchQuery.nbAdults = $(this).val();
      _this.autoBalancePeopleFromAdults();
      _this.inputChanged();
    }); //nb enfants
    this.view.nbEnfants.change(function (e) {
      if(_this.model.searchQuery.nbEnfants == $(this).val()) return ;
      _this.model.searchQuery.nbEnfants = $(this).val();
      _this.autoBalancePeopleFromEnfants();
      _this.inputChanged();
    }); //event onsubmit sur le formulaire
    this.view.form.submit(function (e) {
      e.preventDefault();
      _this.submitForm();
    });
  },
  initFromCookie: function () {
    var _this = this; //remplissage des champs et autoselection en fonction du cookie
    for (var i in this.model.searchQuery) {
      //var r = this.model.searchQuery[i];
      var r = Cookie.read(i);
      if (r !== null && r !== "") {
        var inp = this.view[i];
        if (inp && inp.length !== null) {
          inp.val(r);
          //this.model.searchQuery[i] = r;
        }
      }
    }
    this.view.nbAdults.change();
    this.view.nbEnfants.change();
  },
  //methode generique pour initialiser le handler change sur plusieurs selects, le code etant le meme pour tous les selects passés en paramètre.
  initChangeHandlerForSelects: function (selectsNameArray) {
    var _this = this;
    jQuery.each(selectsNameArray, function (i, name) {
      $(_this.view[name]).change(function (e) {
        if(_this.model.searchQuery[name] != $(this).val())
        {
          _this.model.searchQuery[name] = $(this).val();
          _this.inputChanged();
        }
      });
    });
  },
  // auto balancement du nombre adulte/enfants en fonction des selects
  autoBalancePeopleFromAdults: function () {
    this.fillSelectTo(this.view.nbEnfants.get(0), this.model.searchConfig.maxPeopleByTravel - this.model.searchQuery.nbAdults);
  },
  autoBalancePeopleFromEnfants: function () {
    this.fillSelectTo(this.view.nbAdults.get(0), this.model.searchConfig.maxPeopleByTravel - this.model.searchQuery.nbEnfants);
  },
  //on remplis un select avec un nombres de 1 à number (utile pour les enfants/parents);
  fillSelectTo: function (select, number) {
    var oldSelectedIndex = select.selectedIndex;
    while (select.options.length > 1) {
      select.removeChild(select.options[1]);
    }
    for (var i = 1; i <= number; i++) {
        var option = document.createElement('option');
        option.value = i;
        option.innerHTML = i;
        
      select.appendChild(option);
    }
    select.selectedIndex = oldSelectedIndex;
  },
  // refresh the view went element has changed
  refreshView: function () {
    var _this = this;
    var nbTravels = this.model.searchDatas.nbResults[this.model.searchQuery.travelType] ? this.model.searchDatas.nbResults[this.model.searchQuery.travelType] : 0;
    if (this.model.searchQuery.travelType != "weekend")
    {
      $.ajax({
        type    : "GET",
        url      : window.refreshDestinationUrl, // || '/search/destination.js',
        dataType  : 'json',
        data    : {type: this.model.searchQuery.travelType},
        success    : function(data){
          var option = _this.view.destinationPlace.find('option').eq(0);
          var value = _this.view.destinationPlace.val();
          _this.view.destinationPlace.html(option);
          jQuery.each(data.destinations, function (i, item) {
            option = $('<option value="'+item.id+'">'+item.name+'</option>');
            if(item.id == value)
            {
              option.attr('selected', 'selected');
            }
            _this.view.destinationPlace.append(option);
          });
        },
        error    : function(XMLHttpRequest, textStatus, errorThrown) {
          if(window.console) {
            console.info('error :', n, ':', XMLHttpRequest, textStatus, errorThrown);
          }
        }
      });
      this.view.travelNumber.html(nbTravels + ' ' + this.model.currentTravelText);
    }
  },
  inputChanged: function () {
    var s = this.model.searchQuery;
    for (var i in s) {
      //if (s[i] !== null && s[i] !== "") {
      if (i != 'departureDate' || (s[i] !== null && s[i] !== "")) {
        Cookie.create(i, s[i]);
      }
    }
  },
  submitForm: function () {
    this.view.simpleSearchErrorMsg.html('');
    var res = this.checkForm();
    if (res.length === 0) {
      this.view.form.get(0).submit();
    } else {
      this.view.simpleSearchErrorMsg.html('- ' + res.join('<br/>- '));
    }
  },
  checkForm: function (form) {
    var s = this.model.searchQuery;
    var msg = [];
    if ((!s.departurePlace || s.departurePlace == -1 || s.departurePlace == '') && (!s.destinationPlace || s.destinationPlace == -1 || s.destinationPlace == '')) {
      msg.push('Vous devez choisir une ville de départ ou une destination');
    } //check de la date
    var departureDate = this.strToDate(this.model.searchQuery.departureDate);
    if (departureDate !== null) { //msg.push('la date n\'est pas renseignée');
      var today = new Date();
      today.setHours(0);
      today.setMinutes(0);
      today.setSeconds(0);
      today.setMilliseconds(0);
      var diffDate = new Date();
      diffDate.setTime(departureDate.getTime() - today.getTime());
      var numDays = Math.round(diffDate.getTime() / (24 * 3600000));
      if(!this.model.searchQuery.departureDate.match(/\d{2}\/\d{2}\/\d{4}/gi))
      {
        msg.push("La date de départ doit avoir pour format jj/mm/aaaa");
      }
      else if (numDays < 3) {
        msg.push("La date de départ doit être supérieure de 3 jours à partir de la date d'aujourd'hui");
      }
    }
    return msg;
  },
  strToDate: function (str) {
    if (!str) {
      return null;
    }
    var d = str.split('/');
    return new Date(d[2], parseInt(d[1], 10) - 1, parseInt(d[0], 10));
  }
};

