JALHotels.Utils.pad = function(param) {
  var pStr = String(param);
  return (pStr.length == 2) ? pStr : '0' + pStr;
}

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

JALHotels.ReservationModule.Domestic.prototype = {

  setMultipleHotels : function(hotels) {
    $('select[name=region]', this.f).val('none');
    this.resetHotel($('select[name=hotelNo]', this.f));
    this.setHotelNone($('select[name=hotelNo]', this.f));
    this.setDates();
    this.setVipCode();
    this.setHotels(hotels);
    this.addRegionListener();
    this.addDateListener();
    this.addSubmitListener();
  },

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

  setVipCode : function() {
    if ($('select[name=vipCode]', this.f).length > 0) {
      $('select[name=vipCode] option:first', this.f).attr("selected", "selected");
    }
  },

  setDates : function() {
    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);
    $('input[name=ciDateY]', this.f).val(checkIn.getFullYear());
    $('select[name=ciDateM]', this.f).val(JALHotels.Utils.pad(checkIn.getMonth() + 1));
    this.setDayOptions($('select[name=ciDateD]', this.f));
    $('select[name=ciDateD]', this.f).val(JALHotels.Utils.pad(checkIn.getDate()));
    $('input[name=coDateY]', this.f).val(checkOut.getFullYear());
    $('select[name=coDateM]', this.f).val(JALHotels.Utils.pad(checkOut.getMonth() + 1));
    this.setDayOptions($('select[name=coDateD]', this.f));
    $('select[name=coDateD]', this.f).val(JALHotels.Utils.pad(checkOut.getDate()));
  },

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

  setHotelNone : function(el) {
    el.append('<option value="none">ホテルを選択してください</option>');
  },

  setHotels : function(hotels)  {
    for(var i in hotels) {
      if (this.hotels[hotels[i].region] == undefined) this.hotels[hotels[i].region] = [];
      this.hotels[hotels[i].region][i] = hotels[i].hotelNo;
      this.hotels[hotels[i].hotelNo] = hotels[i];
    }
  },

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

  addRegionListener : function() {
    var self = this;
    $('select[name=region]', self.f).change(function(e) {
      self.resetHotel($('select[name=hotelNo]', self.f));
      if ($(this).val() != 'none') {
        var hotelsByRegion = self.hotels[$(this).val()];
        for(var i in hotelsByRegion) {
          var hotel = self.hotels[hotelsByRegion[i]];
          var option = '<option value="' + hotel.hotelNo + '">' + hotel.name + '</option>';
          $('select[name=hotelNo]', self.f).append(option);
        }
      }
      else {
        self.setHotelNone($('select[name=hotelNo]', this.f));
      }
    });
  },

  setDayOptions : function(el) {
    var self = this;
    var prefix = $(el).attr('name').replace('DateD', '');
    var firstDayOfNextMonth = new Date(
      $('input[name=' + prefix + 'DateY]', self.f).val(),
      $('select[name=' + prefix + 'DateM]', self.f).val(), // next month
      1);
    var lastDay = (new Date(firstDayOfNextMonth -1)).getDate();
    $('select[name=' + prefix + 'DateD]', self.f).empty();
    for(i = 1; i <= lastDay; i ++) {
      var option = '<option value="' + JALHotels.Utils.pad(i) + '">' + i + '</option>';
      $('select[name=' + prefix + 'DateD]', self.f).append(option);
    }
  },

  addDateListener : function() {
    var self = this;
    
    // set the year depending on the month and day, if they are before today then set it as next year
    $('select[name=ciDateM],select[name=ciDateD],select[name=coDateM],select[name=coDateD]', self.f).change(function(e) {
      var depDate = new Date(
        self.now.getFullYear(),
        $('select[name=ciDateM]', self.f).val() - 1,
        $('select[name=ciDateD]', self.f).val(),23,59,59);
      var retDate = new Date(
        self.now.getFullYear(),
        $('select[name=coDateM]',self.f).val() - 1,
        $('select[name=coDateD]', self.f).val(),23,59,59);
      if (depDate.getTime() < self.now.getTime()) {
        depDate.setFullYear(self.now.getFullYear() + 1);
      }
      if (retDate.getTime() < self.now.getTime()) {
        retDate.setFullYear(self.now.getFullYear() + 1);
      }
      $('input[name=ciDateY]', self.f).val(depDate.getFullYear());
      $('input[name=coDateY]', self.f).val(retDate.getFullYear());
    });

    // whenever the check-in date changes, update the check-out date select fields
    $('select[name=ciDateM],select[name=ciDateD]', self.f).change(function(e) {
      var firstDayOfNextMonth = new Date(
        $('input[name=ciDateY]', self.f).val(),
        $('select[name=ciDateM]', self.f).val(), // next month
        1);
      var lastDay = (new Date(firstDayOfNextMonth -1)).getDate();
      if (Number($('select[name=ciDateD]', self.f).val()) <= lastDay) {
        var nextDay = new Date(
          $('input[name=ciDateY]', self.f).val(),
          Number($('select[name=ciDateM]', self.f).val()) - 1,
          Number($('select[name=ciDateD]', self.f).val()) + 1);
      }
      else {
        // add logic to set check-in to the 1st of the month
        var nextDay = new Date(
          $('input[name=ciDateY]', self.f).val(),
          Number($('select[name=ciDateM]', self.f).val()) - 1,
          2);
      }
      $('input[name=coDateY]', self.f).val(nextDay.getFullYear());
      $('select[name=coDateM]', self.f).val(JALHotels.Utils.pad(nextDay.getMonth() + 1));
      self.setDayOptions($('select[name=coDateD]', self.f));
      $('select[name=coDateD]', self.f).val(JALHotels.Utils.pad(nextDay.getDate()));
    });

    $('select[name=ciDateM],select[name=ciDateD],select[name=coDateM],select[name=coDateD]', self.f).change(function(e) {
      var ciDateD = $('select[name=ciDateD]', self.f).val();
      var coDateD = $('select[name=coDateD]', self.f).val();
      self.setDayOptions($('select[name=ciDateD]', self.f));
      self.setDayOptions($('select[name=coDateD]', self.f));
      $('select[name=ciDateD]', self.f).val(ciDateD);
      $('select[name=coDateD]', self.f).val(coDateD);
    });
  },

  addSubmitListener : function() {
    var self = this;
    $(self.f).submit(function(e) {
      e.preventDefault();
      var hotelURL;
      // check if hotelNo is a SELECT elem or an INPUT elem
      if ($('select[name=hotelNo]', self.f).length > 0) {
        var hotelNo = $('select[name=hotelNo]', self.f).val();
        if (hotelNo != 'none') hotelURL = self.hotels[hotelNo].url;
      }
      else if ($('input[name=hotelNo]', self.f).length > 0) {
        var hotelNo = $('input[name=hotelNo]', self.f).val();
        if (hotelNo != 'none') hotelURL = self.hotel.url;
      }
      if (hotelNo == 'none') return false;
      // if hotel has an URL, open the URL in a new window
      if (hotelURL != undefined) {
        var w = window.open(hotelURL, 'jalhotels');
        return false;
      }
      var uri = self.f.attr('action');
      uri = uri + '?' + 'hotelNo=' + hotelNo + '&';
      uri = uri + 'ciDateY=' + $('input[name=ciDateY]', self.f).val() + '&';
      uri = uri + 'ciDateM=' + $('select[name=ciDateM]', self.f).val() + '&';
      uri = uri + 'ciDateD=' + $('select[name=ciDateD]', self.f).val() + '&';
      uri = uri + 'coDateY=' + $('input[name=coDateY]', self.f).val() + '&';
      uri = uri + 'coDateM=' + $('select[name=coDateM]', self.f).val() + '&';
      uri = uri + 'coDateD=' + $('select[name=coDateD]', self.f).val() + '&';
      uri = uri + 'otona=' + $('select[name=otona]', self.f).val() + '&';
      uri = uri + 'room=' + $('select[name=room]', self.f).val();
      if (($('select[name=vipCode]', this.f).length > 0) &&
          ($('select[name=vipCode]', self.f).val() != '')) {
        uri = uri + '&' + 'vipCode=' + $('select[name=vipCode]', self.f).val();
      }
      else if ($('input[name=vipCode]', self.f).length > 0) {
        uri = uri + '&' + 'vipCode=' + $('input[name=vipCode]', self.f).val();
      }
      var winName = 'jalhotels';
      if (!!document.all) {
        // IE does not send Referrer information via form elem; therefore, use an anchor elem
        var body = document.getElementsByTagName("body")[0];
        var link = document.createElement("a");
        link.href = uri;
        link.target = winName;
        body.appendChild(link);
        link.click();
        body.removeChild(link);
      }
      else {
        var w = window.open(uri, winName);
      }
    });
  }
}
