var multipleFlights = 2;
var MAX_PAX = 9;
var numChildren = 0;
var cookie;
var debug = false;

Event.observe(window, 'load', function(event)
{
    //onload initialize some variables, get cookie, etc.
    onloadInit();
    addFormObservers();
    addAutocompleters();
    
    if ($('direction_choice1').checked) {
        setBothWays();
    } else if ($('direction_choice2').checked) {
        setOneWay();
    } else if ($('direction_choice3').checked) {
        setMultipleDestinations();
    } else {
        setBothWays();
    }
});

function onloadInit()
{
    if ($('cookie_noparse')) {
        var cookieTmp = null;
    } else {
        var cookieTemp = getCookie('flightSearch');
    }
	
    if (cookieTemp != null && cookieTemp != '') {
        cookie = $H(unserialize(cookieTemp));
    }
    
    if (debug == true) {
        if (cookie) {
            var debugString = '';
            cookie.each(function(pair)
            {
                debugString += "\n" + pair.key + ' => ' + pair.value;
            });
            alert(debugString);
        }
    }
    
    multipleFlights = Number($('multiple_flights_count').value);
}

function addAutocompleters()
{
    $('source_airport_1',
      'source_airport_2',
      'source_airport_3',
      'source_airport_4',
      'destination_airport_1',
      'destination_airport_2',
      'destination_airport_3',
      'destination_airport_4').each(function(element){
        //------------------------------ adding loader image --------------------
        var loaderImage = new Image();
        loaderImage.src = basePath + '/images/spinner_bilety.gif';
        //------------------------------ adding choices DIV ---------------------
        var choicesDiv = document.createElement('div');
        choicesDiv.id = element.name + '_choices';
        choicesDiv.className = 'autocomplete_div';
        choicesDiv.style.display = 'none';
        element.up('label').insert({after: choicesDiv});
        //----------------------- adding hidden inputs for airport codes --------
        var inputHidden = document.createElement('input');
        inputHidden.id = element.id + '_code';
        inputHidden.name = element.id + '_code';
        inputHidden.type = 'hidden';
//        if (element.id != 'source_airport_1' && element.id != 'destination_airport_1') {
//            inputHidden.disabled', 'disabled');
//        }
        if (cookie) {
            if (cookie.get(element.id + '_code') != undefined) {
                inputHidden.value = cookie.get(element.id + '_code');
            } else {
                if (element.id == 'source_airport_1') {
                    inputHidden.value = '';
                } else if (element.id == 'destination_airport_1') {
                    inputHidden.value = '';
                } else {
                    inputHidden.value = '';
                }
            }
        } else {
            if (element.id == 'source_airport_1') {
                inputHidden.value = '';
            } else if (element.id == 'destination_airport_1') {
                inputHidden.value = '';
            } else {
                inputHidden.value = '';
            }
        }
        element.up('label').insert({after: inputHidden});
        //----------------------- adding autocompleter --------------------------
        new Ajax.Autocompleter(element.name, element.name+"_choices", basePath+"/ajax/autocompleteairports", {
            paramName: "autocomplete", 
            frequency: 0.03,
//            callback: function(input, query) {
//                return Url.encode(query);
//            },
            minChars: 3,
            afterUpdateElement : setAirportCodeAndName,
            onLoading : function(obj) {
                $(element.name + '_search_icon').writeAttribute('src', basePath + '/images/spinner_bilety.gif');
            },
            onSuccess : function(obj) {
                $(element.name + '_search_icon').writeAttribute('src', basePath + '/images/search/lupa.gif');
            }
        });
        function setAirportCodeAndName(text, li) {
            element.value = li.readAttribute('insee:airport');
            $(element.id+'_code').value = li.readAttribute('insee:abbr');
        }
        //------------------------------ clearing airport codes on keypress ---------------------
        Event.observe(element, 'keypress', function(event) {
            $(element.id + '_code').value = "";
        });
        //------------------------------ selecting text upon focus ---------------------------
        Event.observe(element, 'focus', function(event) {
            element.activate(); 
        });
        //------------------------------ adding airport pickers ------------------------------
        addAirportPicker(element);
      });
      //------------------------------ adding calendars -----------------------------------
      $('departing_1',
        'departing_2',
        'departing_3',
        'departing_4',
        'returning_1').each(function(element) {
            Calendar.add(element);
        });
}

function addFormObservers()
{
    //changing visible elements depending on direction_choice
    Event.observe($('direction_choice1'), 'click', setBothWays);
    Event.observe($('direction_choice2'), 'click', setOneWay);
    Event.observe($('direction_choice3'), 'click', setMultipleDestinations);
    //adding or removing flights to multiple destination view
    Event.observe($('add_flight'), 'click', addFlight);
    Event.observe($('remove_flight'), 'click', removeFlight);
    //showing or hiding flight times
    Event.observe($('hide_flight_times'), 'click', function(event){
        $('hide_flight_times', 'departing_time_1_dl', 'returning_time_1_dl').each(function(element) {
            hideElement(element);
        });
        $('departing_time_1', 'returning_time_1').each(function(element) {
            hideAndDisable(element);
        });
        showElement($('show_flight_times'));
    });
    Event.observe($('show_flight_times'), 'click', function(event){
        $('hide_flight_times', 'departing_time_1_dl').each(function(element) {
            showElement(element);
        });
        showAndEnable($('departing_time_1'));
        if ($('direction_choice1').checked) {
            showElement($('returning_time_1_dl'));
            showAndEnable($('returning_time_1'));
        }
        hideElement($('show_flight_times'));
    });
    //passengers selects observers
    Event.observe($('passengers_adults'), 'change', isLessThanMaxPax);
//    Event.observe($('passengers_seniors'), 'change', function(event){
//        isLessThanMaxPax(event);
//        changeSeniorsAgesVisibility();
//    });
    Event.observe($('passengers_infants'), 'change', isLessThanMaxPax);
    Event.observe($('passengers_children'), 'change', function(event) {
        isLessThanMaxPax(event);
        changeChildrenAgesVisibility();
    });
    //airline and travel class toggling
    Event.observe($('hide_travel_class_and_airline'), 'click', function(event){
        $('hide_travel_class_and_airline', 'airline_and_travel_class').each(function(element) {
            hideElement(element);
            hideAndDisable($('travel_class'));
            hideAndDisable($('airline'));
        });
        showElement($('show_travel_class_and_airline'));
    });
    Event.observe($('show_travel_class_and_airline'), 'click', function(event){
        $('hide_travel_class_and_airline', 'airline_and_travel_class').each(function(element) {
            showElement(element);
            showAndEnable($('travel_class'));
            showAndEnable($('airline'));
        });
        hideElement($('show_travel_class_and_airline'));
    });
}

function setMultiFlightsVisibility()
{
    if (multipleFlights > 1 && multipleFlights < 5) {
        for (i = 1; i <= 4; i++) {
            if (i <= multipleFlights) {
                showElement($('flight_source_info_'+i));
                showAndEnable($('source_airport_'+i));
                showAndEnable($('destination_airport_'+i));
                showAndEnable($('departing_'+i));
                showAndEnable($('departing_time_'+i));
            } else {
                hideElement($('flight_source_info_'+i));
                hideAndDisable($('source_airport_'+i));
                hideAndDisable($('destination_airport_'+i));
                hideAndDisable($('departing_'+i));
                hideAndDisable($('departing_time_'+i));
            }
        }
        
        if (multipleFlights > 2) {
            showElement($('remove_flight'));
        } else {
            hideElement($('remove_flight'));
        }
        
        if (multipleFlights < 4) {
            showElement($('add_flight'));
        } else {
            hideElement($('add_flight'));
        }
        
        $('multiple_flights_count').value = multipleFlights;
    }
}

function addFlight() {
    multipleFlights++;
    setMultiFlightsVisibility();
}

function removeFlight() {
    multipleFlights--;
    setMultiFlightsVisibility();
}

function setBothWays() {
    $('source_heading_1',
      'add_flight',
      'remove_flight',
      'hide_flight_times',
      'departing_time_1_dl',
      'returning_time_1_dl',
      'children_age_info',
      'hide_travel_class_and_airline',
      'airline_and_travel_class',
      'flight_source_info_2',
      'flight_source_info_3',
      'flight_source_info_4',
      'flight_destination_info_2',
      'flight_destination_info_3',
      'flight_destination_info_4').each(function(element) {
        hideElement(element); 
      });
      
    $('returning_date_1',
      'airline_div',
      'show_flight_times',
      'show_travel_class_and_airline',
      'flexible_dates_dl').each(function(element) {
        showElement(element); 
      });
    
    $('source_airport_2',
      'source_airport_3',
      'source_airport_4',
      'destination_airport_2',
      'destination_airport_3',
      'destination_airport_4',
      'source_airport_2_code',
      'source_airport_3_code',
      'source_airport_4_code',
      'destination_airport_2_code',
      'destination_airport_3_code',
      'destination_airport_4_code',
      'departing_2',
      'departing_3',
      'departing_4',
      'departing_time_2',
      'departing_time_3',
      'departing_time_4'
      ).each(function(element) {
        hideAndDisable(element);
    });
    
    $('source_airport_1',
      'destination_airport_1',
      'departing_1',
      'returning_1'
      ).each(function(element) {
         showAndEnable(element); 
      });
      
    changeChildrenAgesVisibility();
//    changeSeniorsAgesVisibility();
    
    setHints(messagesRoundTrip);
}

function setOneWay() {
    $('source_heading_1',
      'add_flight',
      'remove_flight',
      'hide_flight_times',
      'hide_travel_class_and_airline',
      'airline_and_travel_class',
      'children_age_info',
      'returning_date_1',
      'departing_time_1_dl',
      'returning_time_1_dl',
      'flight_source_info_2',
      'flight_source_info_3',
      'flight_source_info_4',
      'flight_destination_info_2',
      'flight_destination_info_3',
      'flight_destination_info_4').each(function(element) {
        hideElement(element); 
      });
      
    $('airline_div',
      'flexible_dates_dl',
      'show_flight_times',
      'show_travel_class_and_airline').each(function(element) {
        showElement(element); 
      });
      
    $('source_airport_2',
      'source_airport_3',
      'source_airport_4',
      'destination_airport_2',
      'destination_airport_3',
      'destination_airport_4',
      'source_airport_2_code',
      'source_airport_3_code',
      'source_airport_4_code',
      'destination_airport_2_code',
      'destination_airport_3_code',
      'destination_airport_4_code',
      'departing_2',
      'departing_3',
      'departing_4',
      'departing_time_2',
      'departing_time_3',
      'departing_time_4',
      'returning_1'
      ).each(function(element) {
        hideAndDisable(element);
    });
    
    $('source_airport_1',
      'destination_airport_1',
      'departing_1'
      ).each(function(element) {
         showAndEnable(element); 
      });
      
    changeChildrenAgesVisibility();
//    changeSeniorsAgesVisibility();
    
    setHints(messagesOneWay);
}

function setMultipleDestinations() {
    $('flexible_dates_dl',
      'returning_date_1',
      'returning_time_1_dl',
      'hide_flight_times',
      'show_flight_times',
      'children_age_info',
      'airline_div',
      'airline_and_travel_class').each(function(element) {
        hideElement(element); 
      });
      
    $('source_heading_1',
      'departing_time_1_dl').each(function(element) {
        showElement(element); 
      });
    
    changeChildrenAgesVisibility();
//    changeSeniorsAgesVisibility();
       
    setMultiFlightsVisibility();
    
    setHints(messagesMultiDeparture);
}

function isLessThanMaxPax(event) {
    var sum = Number($('passengers_adults').value)
            + Number($('passengers_infants').value)
            + Number($('passengers_children').value);
    if (sum > MAX_PAX) {
        alert('Maksymalna liczba pasażerów to 9');
        var element = Event.element(event);
        element.value = element.value - (sum-MAX_PAX);
    }
}

function changeChildrenAgesVisibility(){
    //showing or hiding children age info
    if (Number($('passengers_children').value) > 0) {
        $('children_age_info', 'passengers_info').each(function(element) {
            showElement(element); 
          });
    } else {
        hideElement($('children_age_info'));
//        if (Number($('passengers_seniors').value) == 0) {
            hideElement($('passengers_info'));
//        }
    }
    
    for (i = 1; i <= MAX_PAX; i++) {
        if (i <= Number($('passengers_children').value)) {
            showElement($('child_' + i));
            showAndEnable($('children_age_' + i));
        } else {
            hideElement($('child_' + i));
            hideAndDisable($('children_age_' + i));
        }
    }
}

//function changeSeniorsAgesVisibility()
//{
//    //showing or hiding seniors age info
//    if (Number($('passengers_seniors').value) > 0) {
//        $('seniors_age_info', 'passengers_info').each(function(element) {
//            showElement(element); 
//          });
//    } else {
//        hideElement($('seniors_age_info'));
//        if (Number($('passengers_children').value) == 0) {
//            hideElement($('passengers_info'));
//        }
//    }
//    
//    for (i = 1; i <= MAX_PAX; i++) {
//        if (i <= Number($('passengers_seniors').value)) {
//            showElement($('senior_' + i));
//            showAndEnable($('seniors_age_' + i));
//        } else {
//            hideElement($('senior_' + i));
//            hideAndDisable($('seniors_age_' + i));
//        }
//    }
//}

function showElement(element)
{
    element.removeClassName('puste');
    element.show();
}

function showAndEnable(element)
{
    element.removeClassName('puste');
    element.show();
    element.enable();
}

function hideElement(element)
{
    element.addClassName('puste');
}

function hideAndDisable(element)
{
    element.addClassName('puste');
    element.disable();
}
//------------------------ Cookie and unserialization
function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1; 
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    } 
  }
return "";
}

function unserialize(data)
{
    var error = function (type, msg, filename, line){throw new window[type](msg, filename, line);};
    var read_until = function (data, offset, stopchr){
        var buf = [];
        var chr = data.slice(offset, offset + 1);
        var i = 2;
        while(chr != stopchr){
            if((i+offset) > data.length){
                error('Error', 'Invalid');
            }
            buf.push(chr);
            chr = data.slice(offset + (i - 1),offset + i);
            i += 1;
        }
        return [buf.length, buf.join('')];
    };
    var read_chrs = function (data, offset, length){
        buf = [];
        for(var i = 0;i < length;i++){
            var chr = data.slice(offset + (i - 1),offset + i);
            buf.push(chr);
        }
        return [buf.length, buf.join('')];
    };
    var _unserialize = function (data, offset){
        if(!offset) offset = 0;
        var buf = [];
        var dtype = (data.slice(offset, offset + 1)).toLowerCase();
        
        var dataoffset = offset + 2;
        var typeconvert = new Function('x', 'return x');
        var chrs = 0;
        var datalength = 0;
        
        switch(dtype){
            case "i":
                typeconvert = new Function('x', 'return parseInt(x)');
                var readData = read_until(data, dataoffset, ';');
                var chrs = readData[0];
                var readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "b":
                typeconvert = new Function('x', 'return (parseInt(x) == 1)');
                var readData = read_until(data, dataoffset, ';');
                var chrs = readData[0];
                var readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "d":
                typeconvert = new Function('x', 'return parseFloat(x)');
                var readData = read_until(data, dataoffset, ';');
                var chrs = readData[0];
                var readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "n":
                readdata = null;
            break;
            case "s":
                var ccount = read_until(data, dataoffset, ':');
                var chrs = ccount[0];
                var stringlength = ccount[1];
                dataoffset += chrs + 2;
                
                var readData = read_chrs(data, dataoffset+1, parseInt(stringlength));
                var chrs = readData[0];
                var readdata = readData[1];
                dataoffset += chrs + 2;
                if(chrs != parseInt(stringlength) && chrs != readdata.length){
                    error('SyntaxError', 'String length mismatch');
                }
            break;
            case "a":
                var readdata = {};
                
                var keyandchrs = read_until(data, dataoffset, ':');
                var chrs = keyandchrs[0];
                var keys = keyandchrs[1];
                dataoffset += chrs + 2;
                
                for(var i = 0;i < parseInt(keys);i++){
                    var kprops = _unserialize(data, dataoffset);
                    var kchrs = kprops[1];
                    var key = kprops[2];
                    dataoffset += kchrs;
                    
                    var vprops = _unserialize(data, dataoffset);
                    var vchrs = vprops[1];
                    var value = vprops[2];
                    dataoffset += vchrs;
                    
                    readdata[key] = value;
                }
                
                dataoffset += 1;
            break;
            default:
//                error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
            break;
        }
        return [dtype, dataoffset - offset, typeconvert(readdata)];
    };
    return _unserialize(data, 0)[2];
}

var Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}