var searchboxParam = null;

var naEvent = {
  add: function(obj,type,fn) {
    if (obj.attachEvent) {
      obj['e'+type+fn] = fn;
      obj[type+fn] = function() { obj['e'+type+fn](window.event); }
      obj.attachEvent('on'+type,obj[type+fn]);
    } else
    obj.addEventListener(type,fn,false);
  },
  remove: function(obj,type,fn) {
    if (obj.detachEvent) {
      obj.detachEvent('on'+type,obj[type+fn]);
      obj[type+fn] = null;
    } else
    obj.removeEventListener(type,fn,false);
  }
};

var assignEvent = function(elements, event, handler) {
  for (var i = 0; i < elements.length; i++) {
    if (elements[i] != null && elements[i] != undefined) {
      naEvent.add(elements[i], event, handler);
    }
  }
};

var calClick_0 = function() {
  A_TCALS['0'].f_toggle();
}

var calClick_1 = function() {
  A_TCALS['1'].f_toggle();
}

var rateCodeClick = function() {
  if (this.value == searchboxParam.bkeRateCodeValue) this.value = '';
}


var generateBkeSearchbox = function(param) {
  searchboxParam = param;
  var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  var currentDate = new Date();

  var searchboxWrapper = document.getElementById(param.searchboxWrapper);

  var i = null;
  var form = null;
  var field = null;
  var fieldText = null;
  var wrapper = null;
  var option = null;

  searchboxWrapper.innerHTML = '';

  form = createNamedElement('form', 'bke_search');
  setAttr(form, 'action', 'http://' + param.bkeDomain + '/bookings/checkavailability');

  field = createNamedElement('hidden', 'bke_id');
  setAttr(field, 'value', param.bkeId);
  form.appendChild(field);

  if (param.searchboxType == 'nights') {
    field = createNamedElement('hidden', 'bke_departure_day');
    setAttr(field, 'value', '');
    form.appendChild(field);

    field = createNamedElement('hidden', 'bke_departure_month');
    setAttr(field, 'value', '');
    form.appendChild(field);

    field = createNamedElement('hidden', 'bke_departure_year');
    setAttr(field, 'value', '');
    form.appendChild(field);
  }
  
  if (param.searchboxLang !== undefined) {
    field = createNamedElement('hidden', 'lang');
    setAttr(field, 'value', param.searchboxLang);
    form.appendChild(field);    
  }

  wrapper = document.createElement('div');
  setAttr(wrapper, 'class', 'arrival-wrapper');

  field = document.createElement('div');
  setAttr(field, 'class', 'arr-label');
  fieldText = document.createTextNode(param.labelArrival);
  field.appendChild(fieldText);
  wrapper.appendChild(field);

  field = createNamedElement('select', 'bke_arrival_day');
  setAttr(field, 'class', 'dropdown arr-day');
  for (i = 1; i <= 31; i++) {
    field.options[field.options.length] = new Option(i, i);

    if (currentDate.getDate() == i) {
      field.options[field.options.length - 1].selected = true;
    }
  }

  assignEvent([field], 'change', dropdownChange);
  wrapper.appendChild(field);

  field = createNamedElement('select', 'bke_arrival_month');
  setAttr(field, 'class', 'dropdown arr-month');
  for (i = 0; i < months.length; i++) {
    field.options[field.options.length] = new Option(months[i], i + 1);

    if (currentDate.getMonth() == i) {
      field.options[field.options.length - 1].selected = true;
    }
  }
  assignEvent([field], 'change', dropdownChange);
  wrapper.appendChild(field);

  field = createNamedElement('select', 'bke_arrival_year');
  setAttr(field, 'class', 'dropdown arr-year');
  for (i = currentDate.getFullYear(); i <= currentDate.getFullYear() + 2; i++) {
    field.options[field.options.length] = new Option(i, i);
  }
  assignEvent([field], 'change', dropdownChange);
  wrapper.appendChild(field);

  if (param.bkeEnableCalendar === true) {
    field = document.createElement('img');
    setAttr(field, 'id', 'tcalico_0');
    setAttr(field, 'class', 'tcalIcon');
    setAttr(field, 'src', 'https://' + param.bkeDomain + '/calendar/img/cal.gif');
    setAttr(field, 'alt', 'Open Calendar');

    wrapper.appendChild(field);
  }
  form.appendChild(wrapper);

  if (param.searchboxType == 'default') {
    wrapper = document.createElement('div');
    setAttr(wrapper, 'class', 'departure-wrapper');

    field = document.createElement('div');
    setAttr(field, 'class', 'dep-label');
    fieldText = document.createTextNode(param.labelDeparture);
    field.appendChild(fieldText);
    wrapper.appendChild(field);

    field = createNamedElement('select', 'bke_departure_day');
    setAttr(field, 'class', 'dropdown dep-day');
    for (i = 1; i <= 31; i++) {
      field.options[field.options.length] = new Option(i, i);
    }
    wrapper.appendChild(field);

    field = createNamedElement('select', 'bke_departure_month');
    setAttr(field, 'class', 'dropdown dep-month');
    for (i = 0; i < months.length; i++) {
      field.options[field.options.length] = new Option(months[i], i + 1);
    }
    wrapper.appendChild(field);

    field = createNamedElement('select', 'bke_departure_year');
    setAttr(field, 'class', 'dropdown dep-year');
    for (i = currentDate.getFullYear(); i <= currentDate.getFullYear() + 2; i++) {
      field.options[field.options.length] = new Option(i, i);
    }
    wrapper.appendChild(field);

    if (param.bkeEnableCalendar === true) {
      field = document.createElement('img');
      setAttr(field, 'id', 'tcalico_1');
      setAttr(field, 'class', 'tcalIcon');
      setAttr(field, 'src', 'https://' + param.bkeDomain + '/calendar/img/cal.gif');
      setAttr(field, 'alt', 'Open Calendar');
      wrapper.appendChild(field);
    }
    form.appendChild(wrapper);
  }
  else if (param.searchboxType == 'nights') {
    wrapper = document.createElement('div');
    setAttr(wrapper, 'class', 'nights-wrapper');

    field = document.createElement('div');
    setAttr(field, 'class', 'nights-label');
    fieldText = document.createTextNode(param.labelNights);
    field.appendChild(fieldText);
    wrapper.appendChild(field);

    field = createNamedElement('select', 'bke_nights');
    setAttr(field, 'class', 'dropdown nights');
    for (i = 1; i <= 31; i++) {
      field.options[field.options.length] = new Option(i, i);
    }
    assignEvent([field], 'change', dropdownChange);
    wrapper.appendChild(field);
    form.appendChild(wrapper);
  }

  if (param.bkeEnableRateCode === true) {
    if (param.bkeRateCodeValue !== undefined) {
      var bkeRateCodeValue = param.bkeRateCodeValue;
    }
    else {
      var bkeRateCodeValue = '';
    }
    
    wrapper = document.createElement('div');
    setAttr(wrapper, 'class', 'ratecode-wrapper');
    field = createNamedElement('input', 'bke_ratecode');
    setAttr(field, 'type', 'text');
    setAttr(field, 'class', 'text-field ratecode');
    setAttr(field, 'value', bkeRateCodeValue);
    setAttr(field, 'maxlength', 10);
    setAttr(field, 'size', 8);
    assignEvent([field], 'click', rateCodeClick);
    wrapper.appendChild(field);
    form.appendChild(wrapper);
  }

  wrapper = document.createElement('div');
  setAttr(wrapper, 'class', 'submit-wrapper');
  field = createNamedElement('submit', 'bke_submit');
  setAttr(field, 'class', 'submit-button');
  setAttr(field, 'value', 'Book Now');
  wrapper.appendChild(field);
  form.appendChild(wrapper);

  searchboxWrapper.appendChild(form);

  if (param.searchboxType == 'default') {
    new tcal({
      'formname': 'bke_search',
      'inputname_day': 'bke_arrival_day',
      'inputname_month': 'bke_arrival_month',
      'inputname_year': 'bke_arrival_year',
      'minstay': '1',
      'update_dates': true
    });

    assignEvent([this.document.getElementById('tcalico_0')], 'click', calClick_0);

    new tcal({
      'formname': 'bke_search',
      'inputname_day': 'bke_departure_day',
      'inputname_month': 'bke_departure_month',
      'inputname_year': 'bke_departure_year',
      'minstay': '1',
      'update_dates': false
    });

    assignEvent([this.document.getElementById('tcalico_1')], 'click', calClick_1);

    bke_update_dropdown(form,
      form.bke_arrival_day.value,
      form.bke_arrival_month.value,
      form.bke_arrival_year.value, 1);
  }
  else if (param.searchboxType == 'nights') {
    new tcal({
      'formname': 'bke_search',
      'inputname_day': 'bke_arrival_day',
      'inputname_month': 'bke_arrival_month',
      'inputname_year': 'bke_arrival_year',
      'inputname_nights': 'bke_nights',
      'minstay': '1',
      'update_dates': true
    });

    assignEvent([this.document.getElementById('tcalico_0')], 'click', calClick_0);

    bke_update_dropdown(form,
      form.bke_arrival_day.value,
      form.bke_arrival_month.value,
      form.bke_arrival_year.value,
      form.bke_nights.value, 1);
  }
};

var createNamedElement = function(type, name) {
  var element = null;
  // Try the IE way; this fails on standards-compliant browsers
  try {
    if (type == 'form') {
      element = document.createElement('<form method="post" name="' + name + '">');
    }
    else if (type == 'hidden') {
      element = document.createElement('<input type="hidden" name="' + name + '">');
    }
    else if (type == 'submit') {
      element = document.createElement('<input type="submit" name="' + name + '">');
    }
    else {
      element = document.createElement('<' + type + ' name="' + name + '">');
    }
  } catch (e) {
  }

  if (!element) {
    // Non-IE browser; use canonical method to create named element

    if (type == 'form') {
      element = document.createElement('form');
      element.method = 'post';
      element.name = name;
    }
    else if (type == 'hidden') {
      element = document.createElement('input');
      element.type = 'hidden';
      element.name = name;
    }
    else if (type == 'submit') {
      element = document.createElement('input');
      element.type = 'submit';
      element.name = name;
    }
    else {
      element = document.createElement(type);
      element.name = name;
    }
  }
  return element;
};

var setAttr = function(el, attrName, attrValue) {
  var _attr = document.createAttribute(attrName);
  _attr.nodeValue = attrValue;
  el.setAttributeNode(_attr);
};

var dropdownChange = function() {
  var bke_form = document.bke_search;

  if (searchboxParam.searchboxType == 'default') {
    bke_update_dropdown(bke_form,
                        bke_form.bke_arrival_day.value,
                        bke_form.bke_arrival_month.value,
                        bke_form.bke_arrival_year.value, 1);
  }
  else if (searchboxParam.searchboxType == 'nights') {
    bke_update_dropdown(bke_form,
                        bke_form.bke_arrival_day.value,
                        bke_form.bke_arrival_month.value,
                        bke_form.bke_arrival_year.value,
                        bke_form.bke_nights.value, 1);
  }
};

var bke_update_dropdown = function(form, dd, mm, yyyy, min, fix) {
  d1 = new Date(yyyy, mm - 1, dd);

  if (min == '') {
    dd++;
  }
  else {
    for (i = 0; i < min; i++) {
      dd++;
    }
  }

  d2 = new Date(yyyy, mm - 1, dd);

  form.bke_arrival_day.value = d1.getDate();
  form.bke_arrival_month.value = d1.getMonth() + 1;
  form.bke_arrival_year.value = d1.getFullYear();

  if (form.bke_departure_day) {
    form.bke_departure_day.value = d2.getDate();
    form.bke_departure_month.value = d2.getMonth() + 1;
    form.bke_departure_year.value = d2.getFullYear();
  }
};
