// Форма заказа авиабилетов, которая суть не более чем лишняя морда для интерфейса
// бронирования билетов amadeus.net
$(document).ready(function() {

  var urlRoot = $('#base-url').val();
  var dateFormat = $('#date-format').val();
  var amadeusBaseUrl = 'http://wftc2.e-travel.com/plnext/AIEBDXDBDXD/';
  var amadeusKey     = 'BDXDBDXD';
  var isComplex = false;
  var isSingle  = false;
  var minPoints = 3, maxPoints = 6, curPoints = 3;
  var isSearchDone = false;

  var today = new Date; // минимальная дата вылета
  today.addDays(1);
  var nextday = new Date; // следующая за ней
  nextday.addDays(2);
  var lastday = new Date; // максимальная дата вылета
  lastday.addMonths(11);
  lastday.addDays(-1);

  isExtendedSearch = function() { return $('#extra').is(':visible'); }

  updatePoints = function() {
    for (i = 1; i <= curPoints; i++)
      $('#complex-' + i).show();
    for (; i <= maxPoints; i++)
      $('#complex-' + i).hide();
    $('#complex p.choose_date').show();
    $('#complex-' + curPoints + ' p.choose_date').hide();
  };

  setComplexMode = function(v) {
    if (v)
    {
      $('#non-complex').hide();
      $('#complex').show();
      updatePoints();
    }
    else
    {
      $('#complex').hide();
      $('#non-complex').show();
    }
    isComplex = v;
  };

  setSingleMode = function(v) {
    if (v)
      $('#return-date').hide();
    else
      $('#return-date').show();
    isSingle = v;
  };

  // преобразует дату, выбранную в datepicker'е, в Date,
  datePickerGetDate = function(picker) {
    var d = new Date;
    d.setTime(picker.dpGetSelected()[0]);
    return d;
  };


  // преобразует дату, выбранную в datepicker'е, в формат YYYYMMDD,
  // используемый в запросе
  datePickerFormatDate = function(picker) {
    var d = datePickerGetDate(picker), result;
    result = d.getFullYear().toString();
    if (d.getMonth() < 9) result += '0';
    result += d.getMonth() + 1;
    if (d.getDate() < 10) result += '0';
    result += d.getDate();
    return result;
  };

  // Валидация формы
  validate = function() {
    var now = new Date;
    var valid = true;

    // Валидация, что не ввели какую-нибудь хрень
    if (!isComplex)
    {
      if (!$('#from').val())
      {
        $('#from-error').html(messages.fromRequired);
        valid = false;
      }
      if (!$('#to').val())
      {
        $('#to-error').html(messages.toRequired);
        valid = false;
      }
      else if ($('#from').val() == $('#to').val())
      {
        $('#to-error').html(messages.fromSameAsTo);
        valid = false;
      }
      if ($('#date-to').dpGetSelected()[0] < $('#date-from').dpGetSelected()[0] ||
          (!$('#time-from-any:selected').length && !$('#time-to-any:selected').length &&
           $('#date-to').dpGetSelected()[0] == $('#date-from').dpGetSelected()[0] &&
           $('#time-to option:selected').val() <= $('#time-from option:selected').val()))
      {
        $('#date-to-error').html(messages.dateToLessThanFrom);
        valid = false;
      }
      if (datePickerGetDate($('#date-from')).asString() == today.asString() &&
          !$('#time-from-any:selected').length &&
           parseInt($('#time-from option:selected').val().substr(0, 2)) <= now.getHours())
      {
        $('#date-from-error').html(messages.dateTooEarly);
        valid = false;
      }
      if (datePickerGetDate($('#date-to')).asString() == today.asString() &&
          !$('#time-to-any:selected').length &&
           parseInt($('#time-to option:selected').val().substr(0, 2)) <= now.getHours())
      {
        $('#date-to-error').html(messages.dateTooEarly);
        valid = false;
      }
     }
    else
    {
      for (i = 1; i <= curPoints; i++)
      {
        if (!$('#point-' + i).val())
        {
          $('#point-' + i + '-error').html(messages.pointRequired);
          valid = false;
        }
      }
      for (i = 1; i <= curPoints - 1; i++)
      {
        if (datePickerGetDate($('#date-' + i)).asString() == today.asString() &&
            !$('#time-' + i + '-any:selected').length &&
             parseInt($('#time-' + i + ' option:selected').val().substr(0, 2)) <= now.getHours())
        {
          $('#date-' + i + '-error').html(messages.dateTooEarly);
          valid = false;
        }
      }
      for (i = 1; i <= curPoints - 2; i++)
      {
        if ($('#date-' + (i + 1)).dpGetSelected()[0] < $('#date-' + i).dpGetSelected()[0] ||
            (!$('#time-' + i + '-any:selected').length && !$('#time-' + (i + 1) + '-any:selected').length &&
              $('#date-' + (i + 1)).dpGetSelected()[0] == $('#date-' + i).dpGetSelected()[0] &&
              $('#time-' + (i + 1) + ' option:selected').val() <= $('#time-' + i + ' option:selected').val()))
        {
          $('#date-' + (i + 1) + '-error').html(messages.dateToLessThanFrom);
          valid = false;
        }
      }
    }
    /*if (parseInt($('#people').val()) == NaN)
    {
      $('#people-error').html('Введите количество пассажиров.');
      valid = false;
    }
    if (parseInt($('#adults').val()) == NaN)
    {
      $('#adults-error').html('Введите количество взрослых.');
      valid = false;
    }
    if (parseInt($('#children').val()) == NaN)
    {
      $('#children-error').html('Введите количество детей.');
      valid = false;
    }
    if (parseInt($('#infants').val()) == NaN)
    {
      $('#infants-error').html('Введите количество детей.');
      valid = false;
    }*/

    

    // Количество пассажиров (<=9)
    /*if (parseInt($('#adults').val()) + parseInt($('#children').val()) > 9)
    {
      $('#people-error').html('Слишком много пассажиров (должно быть не более 9).');
      valid = false;
    }
    if (!parseInt($('#adults').val()))
    {
      $('#people-error').html('Должен быть хотя бы один взрослый пассажир');
      valid = false;
    }*/

    // Количество лялек
    /*if (parseInt($('#infants').val()) > parseInt($('#adults').val()))
    {
      $('#infants-error').html('Каждый ребенок до 2 лет должен сопровождаться одним взрослым.');
      valid = false;
    }*/

    return valid;
  };

  // У каждого аэропорта есть уникальный идентификатор IATA из трех
  // заглавных латинских букв, например, SVX.  Amadeus принимает IATA
  // в качестве возможного параметра при поиске аэропорта.
  // Функция автокомплита возвращает IATA в конце строки в скобках.
  // Значит, если в конце значения инпута с названием аэропорта/города
  // есть строка вида ' (SVX)', можно и нужно в запросе передавать один только
  // этот IATA.
  extractIATA = function(val) {
    var match = / \(([A-Z][A-Z][A-Z])\)$/.exec(val);
    if (match)
      return match[1];
    else
      return val;
  };


  // Строит URL для GET-запроса
  getAmadeusRequest = function() {
    var req = amadeusBaseUrl + 'AirAvailability.action?';
    req += 'SITE=' + amadeusKey + '&TRIPFLOW=YES';

    // Язык интерфейса
    // XXX Английский -- это GB
    var culture = $('#culture').val().toUpperCase();
    req += '&LANGUAGE=' + (culture == 'EN' ? 'GB' : culture);

    // Тип поездки
    if (isComplex)
      req += '&TRIP_TYPE=C';
    else if (isSingle)
      req += '&TRIP_TYPE=O';
    else
      req += '&TRIP_TYPE=R';

    // Класс
    req += '&CABIN=' + $('#cabin').val();

    // Аэропорты
    if (!isComplex)
    {
      req += '&B_LOCATION_1=' + encode(extractIATA($('#from').val()), culture);
      req += '&E_LOCATION_1=' + encode(extractIATA($('#to').val()), culture);
    }
    else
    {
      for (i = 1; i <= curPoints - 1; i++)
      {
        req += '&B_LOCATION_' + i + '=' + encode(extractIATA($('#point-' + i).val()), culture);
        req += '&E_LOCATION_' + i + '=' + encode(extractIATA($('#point-' + (i + 1)).val()), culture);
      }
    }

    // Кол-во пассажиров (расширенный поиск)
    var num = 1, i;
    for (i = 0; i < parseInt($('#adults').val()); i++)
      req += '&TRAVELLER_TYPE_' + num++ + '=ADT';
    for (i = 0; i < parseInt($('#students').val()); i++)
      req += '&TRAVELLER_TYPE_' + num++ + '=STU';
    for (i = 0; i < parseInt($('#youth').val()); i++)
      req += '&TRAVELLER_TYPE_' + num++ + '=YTH';
    for (i = 0; i < parseInt($('#children').val()); i++)
      req += '&TRAVELLER_TYPE_' + num++ + '=CHD';
    for (i = 1; i <= parseInt($('#infants').val()); i++)
      req += '&HAS_INFANT_' + i + '=TRUE';

    // Даты
    if (!isComplex)
    {
      if ($('#time-from-any').attr('selected'))
        req += '&B_DATE_1=' + datePickerFormatDate($('#date-from')) + '0000&B_ANY_TIME_1=TRUE';
      else
        req += '&B_DATE_1=' + datePickerFormatDate($('#date-from')) + $('#time-from option:selected').text().replace('.', '');
      if (!isSingle)
      {
        if ($('#time-to-any').attr('selected'))
          req += '&B_DATE_2=' + datePickerFormatDate($('#date-to')) + '0000&B_ANY_TIME_2=TRUE';
        else
          req += '&B_DATE_2=' + datePickerFormatDate($('#date-to')) + $('#time-to option:selected').text().replace('.', '');
      }
    }
    else
    {
      for (i = 1; i <= curPoints - 1; i++)
      {
        if ($('#time-' + i + '-any').attr('selected'))
          req += '&B_DATE_' + i + '=' + datePickerFormatDate($('#date-' + i)) + '0000&B_ANY_TIME_' + i + '=TRUE';
        else
          req += '&B_DATE_' + i + '=' + datePickerFormatDate($('#date-' + i)) + $('#time-' + i + ' option:selected').text().replace('.', '');
      }
    }

    // Прямой рейс
    if ($('#direct').attr('checked'))
      req += '&DIRECT_NON_STOP=TRUE';

    return req;
  };

  reset = function() {
    $('.container input').attr('disabled', '');
    $('.container select').attr('disabled', '');    
    if (isExtendedSearch()) 
      $('#people').attr('disabled', 'disabled');
    $('#results').hide();
    $('#results').src = '';
    $('#amadeus-search').html($('#amadeus-search').html().replace(messages.resetLabel, messages.searchLabel));
  };

  // Развешиваем функциональность на контролы

  // date-picker'ы, с датами по умолчанию -- завтра и послезавтра
  if (!($('#date-from').val()))
    $('#date-from').val(today.asString());
  $('#date-from').datePicker({
    clickInput: true,
    createButton: false
  });
  $('#date-from').dpSetStartDate(today.asString());
  $('#date-from').dpSetEndDate(lastday.asString());
  for (i = 1; i <= maxPoints; i++)
  {
    $('#date-' + i).val(today.asString());
    $('#date-' + i).datePicker({
      clickInput: true,
      createButton: false
    });
    $('#date-' + i).dpSetStartDate(today.asString());
    $('#date-' + i).dpSetEndDate(lastday.asString());
/*    if (i < maxPoints)
    {
      $('#date-' + i).bind('dateSelected', function(e, selDate, $td) {
        $('#date-' + (i + 1)).dpSetStartDate(selDate.asString());
        if ($('#date-' + (i + 1)).dpGetSelected()[0] < $('#date-' + i).dpGetSelected()[0])
        {
          $('#date-' + (i + 1)).dpSetSelected(datePickerGetDate($('#date-' + i)).asString());
          $('#date-' + (i + 1)).val(datePickerGetDate($('#date-' + i)).asString());
        }
      });
    } */
  }
  if (!($('#date-to').val()))
    $('#date-to').val(nextday.asString());
  $('#date-to').datePicker({
    clickInput: true,
    createButton: false
  });
  $('#date-to').dpSetStartDate(today.asString());
  $('#date-to').dpSetEndDate(lastday.asString());
  $('#date-from').bind('dateSelected', function(e, selDate, $td) {
    $('#date-to').dpSetStartDate(selDate.asString());
    if ($('#date-to').dpGetSelected()[0] < $('#date-from').dpGetSelected()[0])
    {
      $('#date-to').dpSetSelected(datePickerGetDate($('#date-from')).asString());
      $('#date-to').val(datePickerGetDate($('#date-from')).asString());
    }
  });
   // кнопочки, которые их развертывают
  $('#date-from-pick').click(function() {
    if (isSearchDone) return;
    $('#date-from').dpDisplay(this);
    this.blur();
    return false;
  });
  $('#date-to-pick').click(function() {
    if (isSearchDone) return;
    $('#date-to').dpDisplay(this);
    this.blur();
    return false;
  });
  $('.date-complex-pick').click(function() {
    if (isSearchDone) return;
    $('#date-' + $(this).attr('_num')).dpDisplay(this);
    this.blur();
    return false;
  });

  // режим расширенного поиска
  $('#toggle-extra').toggle(function(e) {
    e.preventDefault();
    if (!isSearchDone)
      $('#people').attr('disabled', 'disabled');
    $('#extra').show();
  }, function(e) {
    e.preventDefault();
    if (!isSearchDone)
      $('#people').attr('disabled', '');
    $('#extra').hide();
  });

  // количество пассажиров -- 8 кнопочек, ужос-ужос...  12 уже
  $('#people-less').click(function() {   // <-- мне нравится название этого селектора
                                         //     хочу версию jQuery для реальной жизни
    if (isSearchDone) return;
    if (isExtendedSearch()) return;
    var npeople   = parseInt($('#people').val()),   ninfants = parseInt($('#infants').val()),
        nchildren = parseInt($('#children').val()), nadults  = parseInt($('#adults').val()),
        nstudents = parseInt($('#students').val()), nyouth   = parseInt($('#youth').val());
    // Люди: -1!
    if (npeople < 2) return;
    $('#people').val(npeople - 1);
    // Синхронизируем поля расширенного поиска.  Сначала пытаемся убить ляльку,
    // потом ребенка, и наконец взрослого.  Капитан Очевидность подсказывает,
    // что это называется социальный дарвинизм.  А теперь еще и студентоту добавили
    if      (ninfants)  $('#infants').val(ninfants - 1);
    else if (nchildren) $('#children').val(nchildren - 1);
    else if (nyouth)    $('#youth').val(nyouth - 1);
    else if (nstudents) $('#students').val(nstudents - 1);
    else if (nadults)   $('#adults').val(nadults - 1);
  });
  $('#people-more').click(function() {
    if (isSearchDone) return;
    if (isExtendedSearch()) return;
    var npeople   = parseInt($('#people').val()), nadults  = parseInt($('#adults').val());
    if (npeople > 8) return;
    $('#people').val(npeople + 1);
    // Презрев школьную биологию, будем считать, что в результате размножения
    // получается сразу половозрелая особь
    $('#adults').val(nadults + 1);
  });
  $('#adults-less').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nadults  = parseInt($('#adults').val()),
        nstudents = parseInt($('#students').val()), nyouth   = parseInt($('#youth').val()),
        ninfants = parseInt($('#infants').val());
    if (nadults < 1) return;
    if (nadults < 2 && !nstudents && !nyouth)
    {
      alert(messages.someAdultsRequired);
      return;
    }
    if (ninfants >= nadults + nstudents + nyouth)
    {
      alert(messages.tooManyInfants);
      return;
    }
    $('#adults').val(nadults - 1);
    $('#people').val(npeople - 1);
  });
  $('#adults-more').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nadults  = parseInt($('#adults').val());
    if (npeople > 8) return;
    $('#adults').val(nadults + 1);
    $('#people').val(npeople + 1);
  });
  $('#students-less').click(function() {  // Студентота?  В МОЕМ самолете?  NO WAI
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nstudents = parseInt($('#students').val()),
        nadults = parseInt($('#adults').val()), nyouth   = parseInt($('#youth').val()),
        ninfants = parseInt($('#infants').val());
    if (nstudents < 1) return;
    if (!nadults && nstudents < 2 && !nyouth)
    {
      alert(messages.someAdultsRequired);
      return;
    }
    if (ninfants >= nadults + nstudents + nyouth)
    {
      alert(messages.tooManyInfants);
      return;
    }
    $('#students').val(nstudents - 1);
    $('#people').val(npeople - 1);
  });
  $('#students-more').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nstudents = parseInt($('#students').val());
    if (npeople > 8) return;
    $('#students').val(nstudents + 1);
    $('#people').val(npeople + 1);
  });
  $('#youth-less').click(function() {  
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nyouth = parseInt($('#youth').val()),
        nadults = parseInt($('#adults').val()), nstudents = parseInt($('#students').val()),
        ninfants = parseInt($('#infants').val());
    if (nyouth < 1) return;
    if (!nadults && !nstudents && nyouth < 2)
    {
      alert(messages.someAdultsRequired);
      return;
    }
    if (ninfants >= nadults + nstudents + nyouth)
    {
      alert(messages.tooManyInfants);
      return;
    }
    $('#youth').val(nyouth - 1);
    $('#people').val(npeople - 1);
  });
  $('#youth-more').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nyouth = parseInt($('#youth').val());
    if (npeople > 8) return;
    $('#youth').val(nyouth + 1);
    $('#people').val(npeople + 1);
  });
  $('#children-less').click(function() {  // детям в самолеты нельзя.  от детей самолеты тупеют
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nchildren = parseInt($('#children').val());
    if (nchildren < 1) return;
    // "Pray!  For the children // You lost along the way,
    //  Still remember the names and faces,
    //  Cold and abandoned // They cry, their fate put in your hands;
    //  When it's over they come to haunt you!.." (c)
    $('#children').val(nchildren - 1);
    $('#people').val(npeople - 1);
  });
  $('#children-more').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), nchildren = parseInt($('#children').val());
    if (npeople > 8) return;
    $('#children').val(nchildren + 1);
    $('#people').val(npeople + 1);
  });
  $('#infants-less').click(function() {  
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), ninfants = parseInt($('#infants').val());
    if (ninfants < 1) return;
    $('#infants').val(ninfants - 1);
    $('#people').val(npeople - 1);
  });
  $('#infants-more').click(function() {
    if (isSearchDone) return;
    var npeople   = parseInt($('#people').val()), ninfants = parseInt($('#infants').val()),
        nstudents = parseInt($('#students').val()), nyouth   = parseInt($('#youth').val()),
        nadults   = parseInt($('#adults').val());
    if (npeople > 8) return;
    if (ninfants >= nadults + nstudents + nyouth)
    {
      alert(messages.tooManyInfants);
      return;
    }
    $('#infants').val(ninfants + 1);
    $('#people').val(npeople + 1);
  });

  // переключение режимов (Туда и Обратно/One Way Ticket/"Я Артемий Лебедев и ниипет")
  $('li.mode-switch').click(function(e) {
    e.preventDefault();
    if ($(this).hasClass('act')) return;
    if (isSearchDone) return;
    $('li.mode-switch').each(function() {
      $(this).removeClass('act');
      $(this).html('<a href="#" class="orange ajax">' + $(this).attr('_title') + '</a>');
    });
    $(this).addClass('act');
    $(this).html('<img src="' + urlRoot + '/images/blank.gif" height="4" width="4" alt="" class="lt" /><img src="' + urlRoot + '/images/blank.gif" height="4" width="4" alt="" class="rt" /><img src="' + urlRoot + '/images/blank.gif" height="4" width="4" alt="" class="lb" /><img src="' + urlRoot + '/images/blank.gif" height="4" width="4" alt="" class="rb" /><a href="#">' + $(this).attr('_title') + '</a>');
  });
  $('#mode-return').click(function() {
    if (isSearchDone) return;
    setComplexMode(false);
    setSingleMode(false);
  });
  $('#mode-single').click(function() {
    if (isSearchDone) return;
    setComplexMode(false);
    setSingleMode(true);
  });
  $('#mode-complex').click(function() {
    if (isSearchDone) return;
    setComplexMode(true);
  });

  // +/- аэропорт в режиме нескольких мест назначения
  $('.del_point').click(function(e) {
    e.preventDefault();
    if (isSearchDone) return;
    if (curPoints > minPoints)
    {
      curPoints--;
      updatePoints();
      var thisPoint = parseInt($(this).attr('_num'));  // надо теперь сдвинуть вверх остальное
      for (i = thisPoint + 1; i <= maxPoints; i++)
      {
        $('#point-' + (i - 1)).val($('#point-' + i).val());
        $('#date-' + (i - 1)).val($('#date-' + i).val());
        $('#time-' + (i - 1)).val($('#time-' + i).val());
      }
      $('#point-' + maxPoints).val('');
      $('#more-points').show();
      if (curPoints == minPoints)
        $('.del_point').hide();
    }
  });
  $('#more-points').click(function(e) {
    e.preventDefault();
    if (isSearchDone) return;
    if (curPoints < maxPoints)
    {
      curPoints++;
      updatePoints();
      $('.del_point').show();
      if (curPoints == maxPoints)
        $('#more-points').hide();
    }
  });

  // кнопка поиска/сброса
  $('#amadeus-search').click(function(e) {
    e.preventDefault();
    if (!isSearchDone)
    {
      $('.error').html('');
      if (validate())
      {
        document.location.href = getAmadeusRequest();
        $('.container input').attr('disabled', 'disabled');
        $('.container select').attr('disabled', 'disabled');
        //$('#amadeus-search').html($('#amadeus-search').html().replace(messages.searchLabel, messages.resetLabel));
        //$('#results').attr('src', 'about:blank');
        $//('#results').show();
        $//('#results').attr('src', getAmadeusRequest());
        //window.scroll(0, $('#amadeus-search').offset().top);
        isSearchDone = true;
      }
    }
    else
    {
      reset();
      isSearchDone = false;
    }
  });

  reset();

});

