﻿// State van dropdowns wordt hierin opgeslagen
var state = {
    adults: '',
    children: '',
    babies: ''
};

// Cache voor de selects zodat deze niet telkens via de DOM-boom opgezocht hoeven te worden
var selects = {
    adults: null,
    children: null,
    babies: null,
    hide: function() {
        //if ($.browser.msie && navigator.userAgent.indexOf('Trident') == -1) {}
        if ($('#' + FlightSearchControls.hideParty).val() == 'true') {
            if (!selects.adults) { getStates(); }

            if ($.browser.msie && $.browser.version <= 7) {
                $('.searchstep3 select:first').css('visibility', 'hidden');
            }
        }
    },
    show: function() {
        if ($.browser.msie && $.browser.version <= 7) {
            $('.searchstep3 select').css('visibility', 'visible');
        }
    },
    disable: function() {
        selects.adults.attr("disabled", "disabled");
        selects.children.attr("disabled", "disabled");
        selects.babies.attr("disabled", "disabled");
    },
    enable: function() {
        selects.adults.removeAttr("disabled");
        selects.children.removeAttr("disabled");
        selects.babies.removeAttr("disabled");
    }
};

// Leest actuele waardes uit dropdowns	
function getStates() {
    return {
        adults: selects.adults.find('option:selected').val(),
        children: selects.children.find('option:selected').val(),
        babies: selects.babies.find('option:selected').val()
    };
}

function setInitialStates() {
    // Selects cachen. Moet opnieuw gebeuren als de selects volledig worden vervangen.
    selects.adults = $('select[name="' + FlightSearchControls.adults + '"]');
    selects.children = $('select[name="' + FlightSearchControls.children + '"]');
    selects.babies = $('select[name="' + FlightSearchControls.babies + '"]');
    state = getStates();
}

// Functie wordt uitgevoerd zodra het document is geladen
$(function() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(function() {
        // re-bind your jquery events here
        // Selects cachen. Moet opnieuw gebeuren als de selects volledig worden vervangen.
        setInitialStates();
    });
    setInitialStates();
});

// onchange van de selects binden
$('select[name="' + FlightSearchControls.adults + '"],select[name="' + FlightSearchControls.children + '"],select[name="' + FlightSearchControls.babies + '"]').livequery('change', function() {
    var values = getStates();
    if (parseInt(values.adults) + parseInt(values.children) + parseInt(values.babies) > 8 || (parseInt(values.adults) < parseInt(values.babies))) {
        popover('errorRGS', $('.searchstep3'), FlightSearchControls.Flights.InvalidParty, FlightSearchControls.Flights.InvalidPartyDesc);
        selects.disable();
        // return to old state
        selects.adults.find('option[value="' + state.adults + '"]').attr('selected', true);
        selects.children.find('option[value="' + state.children + '"]').attr('selected', true);
        selects.babies.find('option[value="' + state.babies + '"]').attr('selected', true);
    } else {
        // save new state
        state = values;
    }
});

function popover(klass, container, title, text) {
    if ($.browser.msie && $.browser.version <= 7 && container.hasClass('searchstep3')) {
        selects.hide();
    }
    
    container.prepend($('<div id=\'popover\'></div>').addClass(klass));
    $('#popover', container).append('<h5>' + title + '</h5><p>' + text + '</p>');
    $('#popover', container).append('<div class=\'popupbutton\'><a href=\'#\' id=\'closepopover\'>Opnieuw kiezen</a></div>');

    $('#closepopover', container).click(function() {
        $('#popover', container).remove();
        if (container.attr('class') == 'searchstep3') {
            selects.enable();
            selects.show();
        }
    });
}

$('#' + FlightSearchControls.departureDateSelector + '_Picker').click(function() {
    var dropFrom = $('#' + FlightSearchControls.fromLocation);
    var dropTo = $('#' + FlightSearchControls.toLocation);
    if (dropFrom.val() == "" || dropTo.val() == "") {
        popover('errorRGS', $('.searchstep2'), FlightSearchControls.Flights.FlightUnknown, FlightSearchControls.Flights.FlightUnknownDesc1);
    }
});

$('#' + FlightSearchControls.returnDateSelector + '_Picker').click(function() {
    var dropFrom = $('#' + FlightSearchControls.fromLocation);
    var dropTo = $('#' + FlightSearchControls.toLocation);
    var departureDateSelector = $find(FlightSearchControls.departureDateSelector + '_Extender');

    if (dropFrom.val() == "" || dropTo.val() == "") {
        popover('errorRGS', $('.searchstep2'), FlightSearchControls.Flights.FlightUnknown, FlightSearchControls.Flights.FlightUnknownDesc2);
    } else if (departureDateSelector.get_selectedDate() == null) {
        popover('errorRGS', $('.searchstep2'), FlightSearchControls.Flights.FlightUnknown, FlightSearchControls.Flights.FlightUnknownDesc3);
    }
});

var _gLocFrom, _gLocTo, _gDateFrom, _gDateTill;
var _popUp = (FlightSearchControls.popUp.toLowerCase() == 'true');

function updateSearchSpace(locFrom, locTo, locIND, locFromDate, locTillDate) {
    _gLocFrom = locFrom;
    _gLocTo = locTo;
    _gDateFrom = locFromDate;
    _gDateTill = locTillDate;
    showProgressBar(true);
    if (!locIND) {
        var dropTo = $('#' + FlightSearchControls.toLocation);
        locTo = ((dropTo.val() != undefined) && (dropTo.val() != "")) ? dropTo.val() : _gLocTo;
        FlightSearchService.set_defaultUserContext('from');
        FlightSearchService.FlightSearch(locFrom, locTo, locFromDate, null, OnComplete, OnError);
    }
    else if (locFromDate == null) {
        var dropFrom = $('#' + FlightSearchControls.fromLocation);
        locFrom = ((dropFrom.val() != undefined) && (dropFrom.val() != "")) ? dropFrom.val() : _gLocFrom;
        FlightSearchService.set_defaultUserContext('to');
        FlightSearchService.FlightSearch(locFrom, locTo, locFromDate, null, OnComplete, OnError);
    }
    else {
        //do NOT use locTillDate: otherwise the departuredates will depend upon the returndate.
        FlightSearchService.set_defaultUserContext('fromdate');
        FlightSearchService.FlightSearch(locFrom, locTo, locFromDate, null, OnComplete, OnError);
    }
}

function OnComplete(result, userContext, methodName) {
    var dropFrom = $('#' + FlightSearchControls.fromLocation);
    var dropFromValue = ((dropFrom.val() != undefined) && (dropFrom.val() != "")) ? dropFrom.val() : _gLocFrom;
    var dropTo = $('#' + FlightSearchControls.toLocation);
    var dropToValue = ((dropTo.val() != undefined) && (dropTo.val() != "")) ? dropTo.val() : _gLocTo;
    var departureDateSelector = $find(FlightSearchControls.departureDateSelector + '_Extender');
    var returnDateSelector = $find(FlightSearchControls.returnDateSelector + '_Extender');
    var criteria = eval("(" + result + ")");

    if (!_popUp) {
        if (criteria.LocationsFrom != null) {
            // Dropdowns legen en standaardoptie toevoegen
            dropFrom.empty().append('<option value="">' + FlightSearchControls.Flights.AllPossibilities + '</option>');
            dropTo.empty().append('<option value="">' + FlightSearchControls.Flights.ChooseYourDestination + '</option>');

            // LocationsFrom vullen in dropFrom
            for (var i in criteria.LocationsFrom) {
                var optGroup = $('<optgroup value="' + criteria.LocationsFrom[i].CountryID + '" label="' + criteria.LocationsFrom[i].CountryDescription.Text + '" />').addClass('dropGroup');
                for (var j in criteria.LocationsFrom[i].Airport) {
                    var opt = $('<option value="' + criteria.LocationsFrom[i].Airport[j].AirportID + '">' + criteria.LocationsFrom[i].Airport[j].AirportDescription.Text + '</option>');
                    if (criteria.LocationsFrom[i].Airport[j].AirportID == dropFromValue) { opt.attr('selected', true); }
                    opt.appendTo(optGroup).addClass('opt');
                }
                optGroup.appendTo(dropFrom);
            }

            // Option met dropFromValue als waarde zoeken.
            // Indien gevonden wordt deze geselecteerd. Anders wordt de eerste option in de dropdown geselecteerd.
            var opt = dropFrom.find('option[value="' + dropFromValue + '"]');
            if (opt.length <= 0) { dropFrom.find('option:first').attr('selected', true); }

            // LocationsTo vullen in dropTo
            for (var i in criteria.LocationsTo) {
                var optGroup = $('<optgroup value="' + criteria.LocationsTo[i].CountryID + '" label="' + criteria.LocationsTo[i].CountryDescription.Text + '" />').addClass('dropGroup');
                for (var j in criteria.LocationsTo[i].Airport) {
                    var opt = $('<option value="' + criteria.LocationsTo[i].Airport[j].AirportID + '">' + criteria.LocationsTo[i].Airport[j].AirportDescription.Text + '</option>');
                    if (criteria.LocationsTo[i].Airport[j].AirportID == dropToValue) { opt.attr('selected', true); }
                    opt.appendTo(optGroup).addClass('opt');
                }
                optGroup.appendTo(dropTo);
            }

            // Option met dropToValue als waarde zoeken.
            // Indien gevonden wordt deze geselecteerd. Anders wordt de eerste option in de dropdown geselecteerd.
            var opt = dropTo.find('option[value="' + dropToValue + '"]');
            if (opt.length <= 0) { dropTo.find('option:first').attr('selected', true); }
        }
    }
    else {
        dropFrom.empty().append('<option value="' + _gLocFrom + '"></option>');
        dropTo.empty().append('<option value="' + _gLocTo + '"></option>');
    }

    //update
    if ((dropFrom.val() != "") && (dropTo.val() != "") || (userContext == "fromdate")) {
        var selectableDate, selectableDates = "";
        if (criteria.TransportToDate != null) {
            var k = 0;
            while (criteria.TransportToDate[k]) {
                selectableDate = ((String)(criteria.TransportToDate[k].Departure.Date.Text)).replace(/-/g, "");
                selectableDates += selectableDate + "_";
                k++;
            }
        }
        if ((selectableDates != "") && (departureDateSelector.get_selectedDate() != null)) {
            departureDateSelector.set_selectedDate(null);
        }
        
        departureDateSelector.set_selectableDates(selectableDates);
        if (selectableDates.indexOf(_gDateFrom) > -1) {
            departureDateSelector.set_selectedDate(Date.parseLocale(_gDateFrom, "yyyyMMdd"));
        }
        
        if ((selectableDates != "") && (departureDateSelector.get_selectedDate() == null)) {
            departureDateSelector.set_visibleDate(Date.parseLocale(selectableDates.substring(0, 8), "yyyyMMdd"));
        }

        // Reset variables
        selectableDate = null;
        selectableDates = ""
        
        if (criteria.TransportFromDate == null) {
            if (departureDateSelector.get_selectedDate() != null) {
                popover('errorRGS', $('.searchstep2'), FlightSearchControls.Flights.FlightUnknown, FlightSearchControls.Flights.FlightUnknownDesc4);
                departureDateSelector.set_selectedDate(null);
            }
        } else {
            var k = 0;
            while (criteria.TransportFromDate[k]) {
                selectableDate = ((String)(criteria.TransportFromDate[k].Departure.Date.Text)).replace(/-/g, "");
                selectableDates += selectableDate + "_";
                k++;
            }
        }
        if ((selectableDates != "") && (returnDateSelector.get_selectedDate() != null)) {
            returnDateSelector.set_selectedDate(null);
        }
        returnDateSelector.set_selectableDates(selectableDates);
        if (_gDateTill != null) { returnDateSelector.set_selectedDate(Date.parseLocale(_gDateTill, "yyyyMMdd")); }
        if ((selectableDates != "") && (returnDateSelector.get_selectedDate() == null)) {
            returnDateSelector.set_visibleDate(Date.parseLocale(selectableDates.substring(0, 8), "yyyyMMdd"));
        }

        var handler = departureDateSelector.get_events().getHandler('dateSelectionChanged');
        if (!handler) {
            handler = Function.createDelegate(departureDateSelector, onDepartureDateSelectionChanged);
            departureDateSelector.get_events().addHandler('dateSelectionChanged', handler);
            handler = Function.createDelegate(departureDateSelector, onReturnDateSelectionChanged);
            returnDateSelector.get_events().addHandler('dateSelectionChanged', handler);
        }
    }
    showControls();
}

function showControls() {
    //disable invalid dropdowns and calendars.
    var departureDateSelector = $find(FlightSearchControls.departureDateSelector + '_Extender');
    var returnDateSelector = $find(FlightSearchControls.returnDateSelector + '_Extender');
    var dropFrom = $('#' + FlightSearchControls.fromLocation);
    var dropTo = $('#' + FlightSearchControls.toLocation);
    var step = 1;
    selects.disable();
    if (departureDateSelector != null) {
        if ($.browser.msie && $.browser.version <= 7) {
            var handler = departureDateSelector.get_events().getHandler('showing');
            if (!handler) {
                handler = Function.createDelegate(departureDateSelector, selects.hide);
                departureDateSelector.get_events().addHandler('showing', handler);
                returnDateSelector.get_events().addHandler('showing', handler);
                handler = Function.createDelegate(departureDateSelector, selects.show);
                departureDateSelector.get_events().addHandler('hiding', handler);
                returnDateSelector.get_events().addHandler('hiding', handler);
            }
        }

        if (dropFrom.val() == "" || dropTo.val() == "") {
            departureDateSelector.set_selectedDate(null);
            departureDateSelector.set_enabled(false);
        } else {
            step = 2;
            departureDateSelector.set_enabled(true);
        }
        if (departureDateSelector.get_selectedDate() == null) {
            returnDateSelector.set_selectedDate(null);
            returnDateSelector.set_enabled(false);
        } else {
            returnDateSelector.set_enabled(true);
        }
        if (returnDateSelector.get_selectedDate() == null) {
            $('#' + FlightSearchControls.zoek).attr('href', "#");
            $('#' + FlightSearchControls.zoek).attr('class', 'submitdisabled submit');
        }
        else {
            step = 3;
            selects.enable();
            $('#' + FlightSearchControls.zoek)
                .attr('href', "javascript:__doPostBack('" + FlightSearchControls.zoekUnique + "','')")
                .attr('class', 'submit');
        }
    }
    showProgressBar(false);
    var progressClass = $('#' + FlightSearchControls.search).attr("class")
    var progressIndex = progressClass.indexOf("activeStep");
    if (progressIndex < 0) {
        $('#' + FlightSearchControls.search).attr("class", progressClass + " activeStep" + step);
    } else {
        $('#' + FlightSearchControls.search).attr("class", progressClass.replace(/activeStep[1,2,3]/, "activeStep"+step));
    }
}

function OnError(result) {
    var departureDateSelector = $find(FlightSearchControls.departureDateSelector + '_Extender');
    var returnDateSelector = $find(FlightSearchControls.returnDateSelector + '_Extender');
    if (departureDateSelector != null) {
        departureDateSelector.set_enabled(false);
        returnDateSelector.set_enabled(false);
        if (_popUp) {
            if (_gDateTill != null) { returnDateSelector.set_selectedDate(Date.parseLocale(_gDateTill, "yyyyMMdd")); }
            if (_gDateFrom != null) { departureDateSelector.set_selectedDate(Date.parseLocale(_gDateFrom, "yyyyMMdd")); }
        }
    }
    
    if (!_popUp) { 
        window.location = errorPage + "?error=" + result.get_message(); 
    }
    
    showProgressBar(false);
}

function onDepartureDateSelectionChanged(sender, args) {
    var departureDateSelector = $find(FlightSearchControls.departureDateSelector + '_Extender');
    var dropFrom = $('#' + FlightSearchControls.fromLocation);
    var dropFromValue = ((dropFrom.val() != undefined) && (dropFrom.val() != "")) ? dropFrom.val() : _gLocFrom;
    var dropTo = $('#' + FlightSearchControls.toLocation);
    var dropToValue = ((dropTo.val() != undefined) && (dropTo.val() != "")) ? dropTo.val() : _gLocTo;

    var departureDate = departureDateSelector.get_selectedDate().localeFormat("yyyyMMdd");
    updateSearchSpace(dropFromValue, dropToValue, 1, departureDate, null);
}

function onReturnDateSelectionChanged(sender, args) {
    showControls();
}

function showProgressBar(pShow) {
    // Elementen die in IE 6 verstopt worden zodra de loader verschijnt
    if ($.browser.msie && $.browser.version <= 7) {
        var hideElements = $('.searchHome, .homebottom')
    }
    
    if (pShow) {
        var _timeOut = parseInt(FlightSearchControls.timeOut);
        $('#inprogress').oneTime(_timeOut + 1, "show", function() {
            var ip = $('#inprogress');
            ip.parent().show();

            // Afmetingen aanpassen aan pagina
            var content = $('.cntContent');
            var hl = content.find('.homeleft:first');
            var hb = content.find('.homebottom:first');
            var hv = content.find('.vliegtickets-content:first');
            
            var h = hl.length == 1 && hb.length == 1 ? hl.height() + hb.height() : hv.length == 1 ? hv.height() : content.height();
            var pt = parseInt(ip.css('padding-top'));
            var pb = parseInt(ip.css('padding-bottom'));

            ip.css({
                'visibility': 'visible',
                'width': content.width(),
                'height': h - pt - pb
            }).show();

            // Verstop enkele elementen zodat de loader correct weer wordt gegeven in IE 6 & 7
            if ($.browser.msie && $.browser.version <= 7) {
                hideElements.css('visibility', 'hidden');
            }
        });
    } else {
        $("#inprogress").stopTime("show");
        $('#inprogress').hide();

        // Toon de verstopte elementen            
        if ($.browser.msie && $.browser.version <= 7) {
            hideElements.css('visibility', 'visible');
        }
    }
}

var __cultureInfo = eval("(" + FlightSearchControls.cultureInfo + ")");
Sys.CultureInfo.CurrentCulture = Sys.CultureInfo._parse(__cultureInfo);
