JALHotels.ReservationModule = function(formId) {
  this.f = $('#' + formId);
  this.now = new Date();
  this.hotels = {};
}

JALHotels.ReservationModule.prototype = {

  setSingleHotel : function(data) {
    this.hotel = data.hotel;
    this.setDates(data.getMonths());
    this.setHotel(this.hotel);
    this.addDateListener();
    this.addSubmitListener();
  },

  setMultipleHotels : function(data) {
    $('select[name=area]', this.f).val('none');
    this.resetSelect($('select[name=country]', this.f));
    this.setSelectNone($('select[name=country]', this.f), "- 選擇國家 -");
    this.resetSelect($('select[name=hotel]', this.f));
    this.setSelectNone($('select[name=hotel]', this.f), "- 選擇酒店 -");
    this.setDates(data.getMonths());
    $('select[name=promo]', this.f).val('none');
    this.addAreaListener(data);
    this.addCountryListener(data);
    this.addDateListener();
    this.addSubmitListener();
  },

  setDates : function(months) {
    // check-in
    var checkIn = new Date(this.now.getFullYear(), this.now.getMonth(), this.now.getDate());
    var checkOut = new Date(this.now.getFullYear(), this.now.getMonth(), this.now.getDate() + 1);
    var counter = 12 + (12 - (checkIn.getMonth() + 1)); //end of next year
    var ciDateYMSel = $('select[name=ciDateYM]', this.f);
    var coDateYMSel = $('select[name=coDateYM]', this.f);
    $('option:first', ciDateYMSel).remove();
    $('option:first', coDateYMSel).remove();
    var ciOptions ='';
    var coOptions ='';
    for(i = 0; i <= counter; i++) {
      var optDate = new Date(checkIn.getFullYear(), checkIn.getMonth() + i, 1);
      var optVal = optDate.getFullYear() + '-' + optDate.getMonth();
      var optTxt = optDate.getFullYear() + '年' + months[optDate.getMonth()].s;
      var ciSelected = '';
      if (i == 0) {
        var ciSelected = 'selected';
      }
      var coSelected = '';
      if ((optDate.getFullYear() == checkOut.getFullYear()) &&
          (optDate.getMonth() == checkOut.getMonth())) {
        var coSelected = 'selected';
      }
      ciOptions += '<option value="' + optVal + '"' + ciSelected + '>' + optTxt + '</option>';
      coOptions += '<option value="' + optVal + '"' + coSelected + '>' + optTxt + '</option>';
    }
    ciDateYMSel.append(ciOptions);
    coDateYMSel.append(coOptions);

    this.setDayOptions(ciDateYMSel);
    $('select[name=ciDateD]', this.f).val(checkIn.getDate());

    this.setDayOptions(coDateYMSel);
    $('select[name=coDateD]', this.f).val(checkOut.getDate());
  },

  resetSelect : function(el) {
    el.empty();
  },

  setSelectNone : function(el, txt) {
    el.append('<option value="none">' + txt + '</option>');
  },

  setHotel : function(hotel) {
    $('input[name=hotel]', this.f).val(hotel.code);
  },

  addAreaListener : function(data) {
    var self = this;
    $('select[name=area]', self.f).change(function(e) {
      self.resetSelect($('select[name=country]', self.f));
      self.resetSelect($('select[name=hotel]', self.f));
      self.setSelectNone($('select[name=hotel]', this.f), "- 選擇酒店 -");
      var area = $(this).val();
      if (area == 'japan') {
        var prefectures = data.getPrefectures();
        for(var i in prefectures) {
          var prefecture = prefectures[i];
          var option = '<option value="' + prefecture.code + '">' + prefecture.name + '</option>';
          $('select[name=country]', self.f).append(option);
        }
        $('select[name=country]', self.f).trigger('change');
      }
      else if (area != 'none') {
        var countries = data.getBy('countries', 'area', area);
        for(var i in countries) {
          var country = countries[i];
          var option = '<option value="' + country.code + '">' + country.name + '</option>';
          $('select[name=country]', self.f).append(option);
        }
        $('select[name=country]', self.f).trigger('change');
      }
      else {
        self.setSelectNone($('select[name=country]', self.f), "- 選擇國家 -");
      }
    });
  },

  addCountryListener : function(data) {
    var self = this;
    $('select[name=country]', self.f).change(function(e) {
      var area = $('select[name=area]', self.f).val();
      var selectedVal = $(this).val();
      self.resetSelect($('select[name=hotel]', self.f));
      if (selectedVal != 'none') {
        if (area == 'japan') {
          var hotels = data.getBy('hotels', 'prefecture', selectedVal);
        }
        else if (area != 'none') {
          var hotels = data.getBy('hotels', 'country', selectedVal);
        }
        for(var i in hotels) {
          var hotel = hotels[i];
          var option = '<option value="' + hotel.code + '">' + hotel.name + '</option>';
          $('select[name=hotel]', self.f).append(option);
        }
      }
      else {
        self.setSelectNone($('select[name=hotel]', self.f), "- 選擇國家 -");
      }
    });
  },

  setDayOptions : function(el) {
    var self = this;
    var prefix = $(el).attr('name').replace('DateYM', '');
    var dateValues = $(el).val().split('-');
    
    var firstDayOfNextMonth = new Date(
      dateValues[0],
      parseInt(dateValues[1]) + 1, // next month
      1);

    var lastDay = (new Date(firstDayOfNextMonth -1)).getDate();
    $('select[name=' + prefix + 'DateD]', self.f).empty();
    var option = '';
    for(i = 1; i <= lastDay; i ++) {
      option += '<option value="' + i + '">' + i + '</option>';
    }
    $('select[name=' + prefix + 'DateD]', self.f).append(option);
  },

  addDateListener : function() {
    var self = this;

    // when check-in year-month changes, update date select otions
    $('select[name=ciDateYM]', self.f).change(function(e) {
      var ciDateD = $('select[name=ciDateD]', self.f).val();
      self.setDayOptions(this);
      $('select[name=ciDateD]', self.f).val(ciDateD);
    });
    
    // when check-out year-month changes, update date select options
    $('select[name=coDateYM]', self.f).change(function(e) {
      var coDateD = $('select[name=coDateD]', self.f).val();
      self.setDayOptions(this);
      $('select[name=coDateD]', self.f).val(coDateD);
    });

    // whenever the check-in changes, update the check-out date select fields
    $('select[name=ciDateYM],select[name=ciDateD]', self.f).change(function(e) {
      var ciDateYM = $('select[name=ciDateYM]', self.f);
      var ciDateD = $('select[name=ciDateD]', self.f);
      var coDateYM = $('select[name=coDateYM]', self.f);
      var dateValues = ciDateYM.val().split('-');
      var firstDayOfNextMonth = new Date(
        dateValues[0],
        parseInt(dateValues[1]) + 1, // next month
        1);
      var lastDay = (new Date(firstDayOfNextMonth -1)).getDate();
      if (Number(ciDateD.val()) <= lastDay) {
        var nextDay = new Date(
          dateValues[0],
          dateValues[1],
          Number(ciDateD.val()) + 1);
      }
      else {
        // add logic to set check-in to the 1st of the month
        var nextDay = new Date(
          dateValues[0],
          dateValues[1],
          2);
      }
      coDateYM
        .val(nextDay.getFullYear() + '-' + nextDay.getMonth())
        .trigger('change');
      $('select[name=coDateD]', self.f).val(nextDay.getDate());
    });

  },

  addSubmitListener : function() {
    var self = this;
    $(self.f).submit(function(e) {
      e.preventDefault();
      var uri = self.f.attr('action');
      // check if hotel is a SELECT elem or an INPUT elem
      if ($('select[name=hotel]', self.f).length > 0) {
        var hotelCode = $('select[name=hotel]', self.f).val();
      }
      else if ($('input[name=hotel]', self.f).length > 0) {
        var hotelCode = $('input[name=hotel]', self.f).val();
      }
      if (hotelCode == 'none') return false;
      if (isNaN(hotelCode)) {
        // if the hotel.code is not a number, set dest parameter
        uri += '?' + 'dest=' + hotelCode;
      }
      else {
        uri += '?' + 'Hotel=' + hotelCode;
      }
      uri += '&Chain=9542&locale=zh-TW';
	  
	  if (hotelCode == '25043') {
	  uri += '&level=2';
	  }

      var arriveYM = $('select[name=ciDateYM]', self.f).val().split('-');
      var arrive = (parseInt(arriveYM[1]) + 1) + '/' +
                   $('select[name=ciDateD]', self.f).val() + '/' +
                   arriveYM[0];
      var departYM = $('select[name=coDateYM]', self.f).val().split('-');
      var depart = (parseInt(departYM[1]) + 1) + '/' +
                   $('select[name=coDateD]', self.f).val() + '/' +
                   departYM[0];

      uri += '&arrive=' + arrive;
      uri += '&depart=' + depart;
      uri += '&adult=' + $('select[name=adult]', self.f).val() + '&child=0';
      uri += '&rooms=' + $('select[name=rooms]', self.f).val();
      var promo = 'none';
      if ($('select[name=promo]', self.f).length > 0) {
        var promo = $('select[name=promo]', self.f).val();
      }
      else if ($('input[name=promo]', self.f).length > 0) {
        var promo = $('input[name=promo]', self.f).val();
      }
      if (promo != 'none') {
        uri += '&shell=jpa&start=1&src=JMB&promo=' + promo;
      }else{
		uri += '&start=1&src=JHC';
	  }

      var w = window.location=uri;
    });
  }
}