/**
 * Booking form engine script
 */
try {
  var use_discount = 0;
  if (USE_DISCOUNTS == undefined) {
    use_discount = 0;
  } else {
    use_discount = USE_DISCOUNTS;
  }
} catch (ex) {

}
var PTC = (("https:" == document.location.protocol) ? "https://" : "http://");
var EBOOKING_URL =  'https://ebooking.sata.pt/';
/* var PARTNER_ID = 1;
var PARTNER_URL = 'http://www.sata.pt';
var PARTNER_LOGO = '';
var LANG = 'pt_PT';*/

var siteLang;
if (LANG == 'pt_PT')
  siteLang = 'pt-pt';
else if ('de_DE')
  siteLang = 'de';
else
  siteLang = 'en';


/**
 * Used to define a "do nothing" action on settimeout functions
 */
function dummy() {}

/**
 * Change the select elemente with given number
 * @param element String - The select element that will be effected
 * @param number int - The number of elements to set
 * @param zeroFill boolean - If the 0 is displayed or not
 * @return void
 */
function changeSelNumber(element, number, zeroFill) {
    var sel = document.getElementById(element);
    var val = $('#'+element).val();
    var zero = (zeroFill) ? 0 : 1;

    $('#'+element).html('');

    for (i = zero; i <= number; i++) {
        sel.options[sel.length] = new Option(i, i, (i == zero), (i == val));
    }
}

/**
 * RouteChooser object
 */
function RouteChooser() {
    //Object name for notify usage
    var name = 'RouteChooser';

    var type = 'normal';
    //A list of observers for this object
    var observers = new Array();

    this.validate = function() {
        var origin = $('#origin').val();
        var destination = $('#destiny').val();

        $('route_origin_error').hide();
        $('route_destination_error').hide();

        if (origin == 0)
            $('#route_origin_error').show();

        if (destination == 0)
            $('#route_destination_error').show();

        return (origin != 0 && destination != 0);
    }

    /**
     * Add an observer to the observers list.
     * @param object The object to add to the list.
     */
    this.addObserver = function (object) {observers.push(object);};

    this.isAward = function () {type = 'award';};

    /**
     * Origin change event handler.
     * Clears the destinations selector HTML and retrieve a new options list
     * via ajax (jsonp)
     */
    $('#origin').change(function() {
        refreshDestinations();
    });

    /**
     * Notify all observers of a specific event
     */
    function notify(event) {
        for (var i=0;i<observers.length;i++) {
            observers[i].update(name, event);
        }
    }

    /**
     * Destination change event handler.
     * Notify all observers of routeChange event
     */
    $('#destiny').change(function() {
        if ($('#destiny').val() != 0) {
            notify('routeChanged');
        }
    });

    /**
     * Returns the origin IATA code value.
     * @return Origin IATA code.
     */
    this.getOrigin = function() {
        return $('#origin').val();
    }

    /**
     * Returns the Destination IATA code value.
     * @return Destination IATA code.
     */
    this.getDestination = function() {
        return $('#destiny').val();
    }

    /**
     * Sets the passenger type for ajax requests.
     * Updates origin and destination for new passenger type.
     * @param value The passenger type as string.
     */
    this.setPassengerType = function(value) {
        $('#usedPassType').val(value);

        refreshOrigins();
        refreshDestinations();
    }

    this.setRoute = function(origin, destination) {
        setOrigin(origin);
        setDestination(destination, origin);
    }

    function setOrigin(origin) {
        $.ajax({
            url: EBOOKING_URL + 'components/getOrigins?lang=' + LANG +
                '&passenger=' + $('#usedPassType').val() + '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#origin').html('');
                $('#origin').html(data.html);
                $('#origin').val(origin);
                //document.getElementById('origin').value = origin;
            }
        });
    }

    function setDestination(destination, origin) {
        var o = origin != null? origin : $('#origin').val();
        
        $.ajax({
            url: EBOOKING_URL + 'components/getDestinations?lang=' + LANG +
                '&passenger=' + $('#usedPassType').val() +
                '&origin=' + o +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#destiny').html('');
                $('#destiny').html(data.html);
                $('#destiny').val(destination);
                //document.getElementById('destiny').value = destination;
                /*
                if ($('#destiny').val() != '0') {
                    notify('routeChanged');
                }*/
            }
        });
    }

    /**
     * Refresh origin option list.
     */
    function refreshOrigins() {
        var origin = $('#origin').val();
        $.ajax({
            url: EBOOKING_URL + 'components/getOrigins?lang=' + LANG +
                '&passenger=' + $('#usedPassType').val() + '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#origin').html('');
                $('#origin').html(data.html);
                document.getElementById('origin').value = origin;
            }
        });
    }

    /**
     * Refresh destination option lsit
     */
    function refreshDestinations() {
        var $url;
        if (type == 'award') {
          $url = EBOOKING_URL + 'components/getAwardDestinations?lang=' + LANG +
                '&origin=' + $('#origin').val() +
                '&callback=?';
        } else {
          $url = EBOOKING_URL + 'components/getDestinations?lang=' + LANG +
                '&passenger=' + $('#usedPassType').val() +
                '&origin=' + $('#origin').val() +
                '&callback=?';
        }
        var destination = $('#destiny').val();
        $.ajax({
            url: $url,
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#destiny').html('');
                $('#destiny').html(data.html);
                document.getElementById('destiny').value = destination;
                if ($('#destiny').val() != '0') {
                    notify('routeChanged');
                }
            }
        });
    }

    /**
     * Set origin and refresh the destination option list.
     * @param code IATA code of the airport.
     */
    this.setOrigin = function(code) {
        document.getElementById('origin').value = code;
        refreshDestinations();
    }

    /**
     * Set destination value.
     * @param code IATA code of the airport.
     */
    this.setDestination = function(code) {
        document.getElementById('destiny').value = code;
    }
}

/**
 * DatePickers object
 */
function DatePickers(rangeMode, hasPreviousDay) {
    /**
     * Datepicker definations.
     * $ datePicker general options for departure/returm
     */
    function DatePickerOptions() {
        this.showButtonPanel = false;
        this.changeMonth = true;
        this.changeYear = true;
        this.dateFormat = 'DD, d MM, yy';
        this.showOn = 'both';
        this.buttonImage = 'https://www.sata.pt/sites/all/themes/sata/images/layout/bt_picker.png';
        this.buttonImageOnly = true;
        var firstDay = new Date();

        if (typeof rangeMode != 'undefined' && hasPreviousDay == true)
            firstDay.setDate(firstDay.getDate()-1);

        this.minDate = firstDay;
        this.altFormat = 'yy-mm-dd';
        this.numberOfMonths = 1;
        this.yearRange = '-01:+01';
        this.setMaxDate = function() {
            var dte = new Date();
            dte.setFullYear(dte.getFullYear()+1, 11, 31);
            return dte;
        }
        this.maxDate = this.setMaxDate();
    }

    //the DOM elements for departure and return datepickers
    var departureDate = 'chooseDeparture';
    var returnDate   = 'chooseArrival';

    //the mode that date DatePickers will work
    var mode = 'single';

    var last_day = false;

    if ((rangeMode == 'single' || rangeMode == 'doble') && (typeof rangeMode != 'undefined'))
        mode = rangeMode;

    if (typeof rangeMode != 'undefined' && hasPreviousDay == true)
        last_day = true;
    
    //Object name for notify usage
    var name = 'DatePickers';

    //period objects for available dates
    var departurePeriods = null;
    var returnPeriods = null;

    /**
     * Checks if a value exists in an array
     * @param needle The searched value.
     * @param haystack The array.
     * @param strict If the third parameter strict  is set
     * to TRUE  then the in_array() function will also
     * check the types of the needle  in the haystack.
     * @return bool TRUE if needle  is found in the array, FALSE otherwise.
     */
    function in_array(needle, haystack, strict) {
        //var found = false, key; // this is stupid => aastrict = !!strict;
        for (var key in haystack) {
            if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
                return true;
            }
        }

        return false;
    }

    /*
     * Arrival date datePicker specific options
     */
    var returnOptions = new DatePickerOptions();
    returnOptions.altField = '#arrival';
    returnOptions.beforeShowDay = checkReturnDay;
    returnOptions.onSelect = updateDep;

    /*
     * Departure date datePicker specific options
     */
    var departureOptions = new DatePickerOptions();
    departureOptions.altField = '#departure';
    departureOptions.beforeShowDay = checkDepartureDay;
    departureOptions.onSelect = updateArr;

    //A list of observers for this object
    var observers = new Array();

    /**
     * Add an observer to the observers list.
     * @param object The object to add to the list.
     */
    this.addObserver = function (object) {observers.push(object);};

    /**
     * Notify all observers of a specific event
     */
    function notify(event) {
        for (var i=0;i<observers.length;i++) {
            observers[i].update(name, event);
        }
    }

    /**
     * Initializes the datepickers
     */
    this.startUp = function() {
        $('#' + departureDate).datepicker(departureOptions);
        if (mode != 'single') {
            $('#' + returnDate).datepicker(returnOptions);
        }
    }

    /**
     * Used to update dates on departure datepicker.
     * This method is used when a date is selected on return datepicker.
     */
    function updateDep() {
        try {
            var dt = $("#"+returnDate).datepicker('getDate');
            var ar = $("#"+departureDate).datepicker('getDate');
            window.setTimeout('dummy()', 250);
            $("#"+departureDate).datepicker('option', 'maxDate', dt);
            $("#"+departureDate).datepicker('setDate', ar);
        } catch (e) {}
    }

    /**
     * Used to update dates on return datepicker.
     * This method is used when a date is selected on departure datepicker.
     * Only works if isn't on sigle mode
     */
    function updateArr() {
        if (mode != 'single' && !$("#"+returnDate).datepicker("isDisabled")) {
            try {
                var dt = $("#"+departureDate).datepicker('getDate');
                var ar = $("#"+returnDate).datepicker('getDate');
                window.setTimeout('dummy()', 250);
                $("#"+returnDate).datepicker('option', 'minDate', dt);
                if (!$('#oneWay').attr('checked')) {
                    if (ar<=dt) {
                        $("#"+returnDate).datepicker('setDate', dt);
                    } else {
                        $("#"+returnDate).datepicker('setDate', ar);
                    }
                }
            } catch (e) {}
        }
    }

    /**
     * BeforeShowDay handler on departure datepicker
     * @param day Date object
     */
    function checkDepartureDay(day) {
        var valid = false;
        if (departurePeriods != null && checkRouteDay(day, departurePeriods)) {
            valid = checkPassengerDay(day, departurePeriods);
        }
        return (valid) ?  [1,''] : [0, ''];
    }

    /**
     * BeforeShowDay handler on return datepicker
     * @param day Date object
     */
    function checkReturnDay(day) {
        var valid = false;
        if (returnPeriods != null && checkRouteDay(day, returnPeriods)) {
            valid = checkPassengerDay(day, returnPeriods);
        }
        return (valid) ?  [1,''] : [0, ''];
    }

    /**
     * Checks if a day (Date) is valid on routes in specific periodes
     * @param day Date object
     * @param per Periods object, can be departurePeriods or returnPeriods
     * @return boolean
     */
    function checkRouteDay(day, per) {
        var valid = false;
        $.each(per.ROUTE, function() {
            if (day >= new Date(this.Start) && day <= new Date(this.End)) {
                if (in_array(day.getDay(), this.Frequency, false))
                    valid = true;
            }
        });
        return valid;
    }

    /**
     * Checks if a day (Date) is valid on passengers in specific periods
     * @param day Date object
     * @param per Periods object, can be departurePeriods or returnPeriods
     * @return boolean
     */
    function checkPassengerDay(day, per) {
        var valid = false;
        $.each(per.PASSENGER, function() {
            if (day >= new Date(this.Start) && day <= new Date(this.End)) {
                if (in_array(day.getDay(), this.Frequency , false))
                    valid = true;
            }
        });
        
        return valid;
    }

    /**
     * Sets departurePeriods object
     * @param periods Departure periods object
     */
    this.setDeparturePeriods = function(periods) {departurePeriods = periods;}

    /**
     * Sets returnPeriods object
     * @param periods Return periods object
     */
    this.setReturnPeriodes = function(periods) {returnPeriods = periods;}

    /**
     * Updates the selected date to the first available date on departure
     * datepicker based on departure period values.
     * Refreshes the datepickers.
     */
    this.updateDates = function() {
        var dep = $('#' + departureDate).datepicker('getDate');
        var arr = rangeMode == 'doble' ? $('#' + returnDate).datepicker('getDate') : false;
        var day = $('#' + departureDate).datepicker('getDate');

        $('#date-warning').fadeOut();

        while (checkDepartureDay(day)[0] != 1 && day < departureOptions.maxDate) {
            day.setDate(day.getDate()+1);
        }

        if (!$('#oneWay').attr('checked')) {
            if (arr && checkReturnDay(arr)[0] == 1) {
                $('#' + returnDate).datepicker('setDate', arr);
            } else {
                $('#' + returnDate).datepicker('setDate', day);
            }
        }

        $('#' + departureDate).datepicker('option', 'maxDate', '+1y');
        
        if (checkDepartureDay(dep)[0] == 1) {
            $('#' + departureDate).datepicker('setDate', dep);
        } else {
            $('#' + departureDate).datepicker('setDate', day);
            $('#date-warning').fadeIn('fast');
        }
    }

    this.setReturn = function(state) {
        if (state) {
            $('#' + returnDate).datepicker("enable");
        } else {
            $('#' + returnDate).datepicker("disable");
        }
    }

    // HERE
    this.setDepartureDate = function(dt) {
        $('#' + departureDate).datepicker('setDate', new Date(dt.year, dt.month - 1, dt.day));
    }

    this.setReturnDate = function(dt) {
        $('#' + returnDate).datepicker('setDate', new Date(dt.year, dt.month - 1, dt.day));
    }
}

/**
 * PassengerSelector object
 */
function PassengerSelector() {
    //Object name for notify usage
    var name = 'PassengerSelector';
    //A list of observers for this object
    var observers = new Array();

    //default max numbers for pax selectors
    var adultMaxNumber = 8;
    var childMaxNumber = 8;
    var infantMaxNumber = 8;

    /**
     * Set the alowed max number for adults
     * @param number The new max number
     */
    this.setAdultMaxNumber = function(number) {
        adultMaxNumber = number;
        updateSelNumber('adultNumber', number, false);
    }

    /**
     * Set the alowed max number for Chidls
     * @param number The new max chidls
     */
    this.setChildMaxNumber = function(number) {
        childMaxNumber = number;
        updateSelNumber('childNumber', number, true);
    }

    this.setInfantMaxNumber = function(number) {
        infantMaxNumber = number;
        //updateSelNumber('infantMaxNumber', number, true);
        updateSelNumber('infantNumber', number, true);
    }

    this.validate = function() {
        /* Isto já não faz sentido (?)
        var adults = parseInt($('#adultNumber').val(), 10);
        var childs = parseInt($('#childNumber').val(), 10);
        var infants = parseInt($('#infantNumber').val(), 10);

        if (adults + childs > 8)
            $('#errorList').append('<li>O numero de adultos + o numero de crianças não pode exceder os 8</li>')

        if (childs > adults && adults == 0)
            $('#errorList').append('<li>As crianças têm que ser acompanhadas por pelo menos um adulto</li>');

        if (infants > adults)
            $('#errorList').append('<li>O numero de infants não pode ser maior que o numero de adultos</li>')

        return (adults + childs <= 8 && infants <= adults && adults > 0);
        */
       return true;
    }

    /**
     * Add an observer to the observers list.
     * @param object The object to add to the list.
     */
    this.addObserver = function (object) {observers.push(object);};

    /**
     * Notify all observers of a specific event
     */
    function notify(event) {
        for (var i=0;i<observers.length;i++) {
            observers[i].update(name, event);
        }
    }
    /**
     * Update pax selectors
     * @param element String - The select element that will be effected
     * @param number int - The number of elements to set
     * @param zeroFill boolean - If the 0 is displayed or not
     */
    function updateSelNumber(element, number, zeroFill) {
         var val = $('#'+element).val();
         changeSelNumber(element, number, zeroFill);
         $('#'+element).val(val);
    }

    /**
     * Adult pax select change handler
     */
    $('#adultNumber').change(function() {
        var adtNumber = $('#adultNumber').val();

        if (adtNumber <= infantMaxNumber)
            changeSelNumber('infantNumber', adtNumber, true);
        else
            changeSelNumber('infantNumber', infantMaxNumber, true);

        var numChilds = childMaxNumber - adtNumber;
        if (numChilds>0)
            changeSelNumber('childNumber', numChilds, true);
        else
            changeSelNumber('childNumber', 0, true);
    });

    /**
     * Child pax select change handler
     */
    $('#childNumber').change(function() {
        var numadults = adultMaxNumber -  $('#childNumber').val();
        changeSelNumber('adultNumber', numadults, false);
        /*
        if (numadults > 1) {
            changeSelNumber('adultNumber', numadults, false);
        } else  {
            changeSelNumber('adultNumber', 1, false);
        }*/
    });

    /**
     * Passenger change event handler
     */
    $('#passenger').change(function(){
        notify('passChanged');
    });

    this.routeChanged = function (origin, destination) {
        var val = $('#passenger').val();
        $.ajax({
            url: EBOOKING_URL + 'components/getPassengerByRoute?lang=' + LANG +
                '&origin=' + origin +
                '&destination='+ destination +
                '&store='+ PARTNER_ID +'&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data){
                $('#passenger').html('');
                $('#passenger').html(data.html);
                document.getElementById('passenger').value = val;
            }
        });
    }

    this.getPassengerType = function() {
        return $('#passenger').val();
    }

    this.setPassengerType = function(paxType) {
        $('#passenger').val(paxType);
        $('#usedPassType').val(paxType);
    }

    this.setPassengerForRoute = function(paxType, origin, destination) {
        $('#usedPassType').val(paxType);
        $.ajax({
            url: EBOOKING_URL + 'components/getPassengerByRoute?lang=' + LANG +
                '&origin=' + origin +
                '&destination='+ destination +
                '&store='+ PARTNER_ID +'&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data){
                $('#passenger').html('');
                $('#passenger').html(data.html);
                $('#passenger').val(paxType);
            }
        });
    }
}

/**
 * SearchTypeSelector object
 */
function SearchTypeSelector() {
    /**
     * Switches betwee flexible or exact dates
     * @param state The boolean state of selector
     */
    this.setFlexibleDates = function(state) {
        if (state) {
            //$('#flexPriceYes').attr('disabled', false);
            //$('#flexPriceYes').attr('checked', true);
        } else {
            //$('#flexPriceNo').attr('disabled', false);
            $('#flexPriceNo').attr('checked', true);
        }
    }

    this.disableFlexibleDates = function(state) {
        if (state) {
            //$('#flexPriceYes').attr('disabled', true);
            $('#flexPriceNo').attr('checked', true);
        }else {
            //$('#flexPriceNo').attr('disabled', true);
            $('#flexPriceYes').attr('checked', true);
        }
    }
}

/**
 * Mode Selector object
 */
function ModeSelector() {
    //Object name for notify usage
    var name = 'ModeSelector';
    //A list of observers for this object
    var observers = new Array();

    /**
     * Add an observer to the observers list.
     * @param object The object to add to the list.
     */
    this.addObserver = function (object) {observers.push(object);};

    /**
     * Notify all observers of a specific event
     */
    function notify(event) {
        for (var i=0;i<observers.length;i++) {
            observers[i].update(name, event);
        }
    }

    /**
     * Round trip click event handler
     */
    $('#roundTrip').click(function() {
    //$('#roundTrip').change(function () {
        notify('roundTrip');
    });

    /**
     * One way click event handler
     */
    $('#oneWay').click(function() {
    //$('#oneWay').change(function() {
        notify('oneWay');
    });

    /**
     * Set round trip mode
     */
    this.setRoundTrip = function() {
        $('#roundTrip').attr('disabled', false);
        $('#roundTrip').attr('checked', true);
        $('#roundTrip').click();
    }

    /**
     * Set one way mode
     */
    this.setOneWay = function() {
        $('#oneWay').attr('disabled', false);
        $('#oneWay').attr('checked', false);
        $('#oneWay').click();
    }

    this.disableRoundTrip = function() {
        $('#roundTrip').attr('disabled', true);
        $('#oneWay').attr('checked', true);
    }

    this.disableOneWay = function() {
        $('#oneWay').attr('disabled', true);
        $('#roundTrip').attr('checked', true);
    }

    this.enableRoundTrip = function() {
        $('#roundTrip').attr('disabled', false);
    }

    this.enableOneWay = function() {
        $('#oneWay').attr('disabled', false);
    }
}

var startDate = new Date();

var MultiCity = {
    legs: 6,
    currentLeg: 1,
    openJaws: 2,
    currentOpenJaws:0,
    originOptions: {},
    datesForLeg: new Array(),
    dateOptions : {
        showButtonPanel: false,
        changeMonth: true,
        changeYear: true,
        dateFormat: 'DD, d MM, yy',
        showOn: 'both',
        buttonImage: 'https://www.sata.pt/sites/all/themes/sata/images/layout/bt_picker.png',
        buttonImageOnly: true,
        minDate: new Date(),
        altFormat: 'yy-mm-dd',
        numberOfMonths: 1,
        yearRange: '-01:+01',
        beforeShowDay: checkMcDay
    },
    originLabel: $('#originLabel').val(),
    destinyLabel: $('#destinyLabel').val(),
    dateLabel: $('#dateLabel').val(),
    firstChoiceLabel: $('#firstChoiceLabel').val(),
    
    setMaxDate: function() {
        var dte = new Date();
        dte.setFullYear(dte.getFullYear()+1, 11, 31);
        return dte;
    },

    setup: function () {
        MultiCity.originLabel = $('#originLabel').val();
        MultiCity.destinyLabel = $('#destinyLabel').val();
        MultiCity.dateLabel = $('#dateLabel').val();
        MultiCity.firstChoiceLabel = $('#firstChoiceLabel').val();
        $('#SataLagsContainer').html('');
        this.currentLeg = 1;
        this.currentOpenJaws = 0;
        this.addLeg();
        /**
         * Adult pax select change handler
         */
        $('#adultNumberMc').change(function() {
            var adtNumber = $('#adultNumberMc').val();
            
            if (adtNumber <= 8)
                changeSelNumber('infantNumberMc', adtNumber, true);
            else
                changeSelNumber('infantNumberMc', 8, true);

            var numChilds = 8 - adtNumber;
            if (numChilds>0)
                changeSelNumber('childNumberMc', numChilds, true);
            else
                changeSelNumber('childNumberMc', 0, true);
        });

        /**
         * Child pax select change handler
         */
        $('#childNumberMc').change(function() {
            var numadults = 8 -  $('#childNumberMc').val();
            changeSelNumber('adultNumberMc', numadults, false);
        });
    },

    reset: function () {
        this.setup();
    },

    setInitialDate: function(){
        this.dateOptions.altField = '#date'+this.currentLeg;
        this.dateOptions.maxDate = this.setMaxDate();
        if (this.currentLeg > 1) {
            this.dateOptions.minDate = $('#chooseDate'+(MultiCity.currentLeg-1)).datepicker('getDate');
            if (this.currentLeg > 2) {
                if ($('#date'+(MultiCity.currentLeg-2)).val() == $('#date'+(MultiCity.currentLeg-1)).val()){

                    dateMin = $('#chooseDate'+(MultiCity.currentLeg-1)).datepicker('getDate');
                    dateMin.setDate(dateMin.getDate() + 1);
                    this.dateOptions.minDate = dateMin;
                }
            }
        }
        return this.dateOptions;
    },

    addLeg: function() {

        if (MultiCity.legs >= MultiCity.currentLeg) {
            
            var html = '<li id="leg'+this.currentLeg+'" style="display: none;">'+'<div class="SataMcRow"><h2>'+this.currentLeg+'</h2></div>'+
                '<div class="SataMcOrigin"><label for="origin'+this.currentLeg+'">'+this.originLabel+'</label>'+
                '<select class="SataMcSelect" id="origin'+this.currentLeg+'" name="data[origin][]" onchange="MultiCity.updateDestiny(this.value, '+this.currentLeg+');"></select>'+
                '</div><div class="SataMcDestiny"><label for="destiny'+this.currentLeg+'">'+this.destinyLabel+'</label>'+
                '<select class="SataMcSelect" id="destiny'+this.currentLeg+'" name="data[destiny][]" onchange="MultiCity.updateDates('+this.currentLeg+');"><option value="0">' + this.firstChoiceLabel + '</option></select>'+
                '</div><div class="SataMcDate"><label for="chooseDate'+this.currentLeg+'">'+this.dateLabel+'</label>'+
                '<input type="text" id="chooseDate'+this.currentLeg+'" size="35" />' +
                '<input type="hidden" name="data[date][]" value="" id="date'+this.currentLeg+'" />'+
                '</div></li>';
            $('#SataLagsContainer').append(html);
            $('#leg'+MultiCity.currentLeg).show('blind');
            $('#chooseDate'+MultiCity.currentLeg).datepicker(MultiCity.setInitialDate());
            $('#chooseDate'+MultiCity.currentLeg).attr("readonly", true);
            $('.SataMcDate img').show();
            this.updateOrigins();

            if (MultiCity.currentLeg == 1)
                $('#chooseDate'+MultiCity.currentLeg).datepicker('setDate', startDate);
            else 
                $('#chooseDate'+MultiCity.currentLeg).datepicker('setDate',
                    $('#chooseDate'+(MultiCity.currentLeg-1)).datepicker('getDate')
                );
            
            
            this.checkButtonDisplay();
            this.blockLastLeg();
            setTimeout(function(){
                if (MultiCity.currentLeg > 1) {
                    $('#origin'+MultiCity.currentLeg).val($('#destiny'+(MultiCity.currentLeg-1)).val());
                    $('#origin'+MultiCity.currentLeg).change();
                    if (MultiCity.countOpenJaws())
                        $('#origin'+MultiCity.currentLeg).attr('disabled', true);
                }
            }, 300);
        }

    },

    countOpenJaws: function() {
        var currentLeg = 0;
        var nextLeg = 0;
        var nextI = 0;
        var openJaws = 0;
        for(var i=1; i<=this.currentLeg; i++) {
            currentLeg = $('#destiny'+i).val();
            nextI = i+1;
            if (nextI <= this.currentLeg) {
                 nextLeg = $('#origin'+nextI).val();
                 if (currentLeg != nextLeg)
                     openJaws++;
            }
        }
        return (openJaws >= this.openJaws);
    },

    blockLastLeg: function() {
        if (MultiCity.currentLeg > 1) {
            var leg = MultiCity.currentLeg -1;
            $('#origin'+leg).attr('disabled', true);
            $('#destiny'+leg).attr('disabled', true);
            $('#chooseDate'+leg).datepicker( "disable" );
        }
    },

    unblockLastLeg: function() {
        var leg = MultiCity.currentLeg;
        $('#origin'+leg).attr('disabled', false);
        $('#destiny'+leg).attr('disabled', false);
        $('#chooseDate'+leg).datepicker( "enable" );
    },

    enableAll: function() {
        for (var i=1; i<=this.currentLeg; i++) {
            $('#origin'+i).attr('disabled', false);
            $('#destiny'+i).attr('disabled', false);
            $('#chooseDate'+i).datepicker( "enable" );
        }
    },

    checkLeg: function() {
        var origin = $('#origin'+this.currentLeg).val();
        var destination = $('#destiny'+this.currentLeg).val();

        $('route_origin_error').hide();
        $('route_destination_error').hide();

        if (origin == 0)
            $('#route_origin_error').show();

        if (destination == 0)
            $('#route_destination_error').show();
        
        if (origin != 0 && destination != 0){
            return true;
        } else {
            $('#book_error_dialog').dialog('open');
            return false;
        }

    },

    removeLeg: function() {
        $('#leg'+MultiCity.currentLeg).hide('blind');
        $('#leg'+MultiCity.currentLeg).remove();
        MultiCity.currentLeg--;
        this.unblockLastLeg();
        this.checkButtonDisplay();
    },

    checkButtonDisplay: function() {
        if (MultiCity.currentLeg >= MultiCity.legs) {
            $('#SataMcAddLeg').hide();
        } else {
            $('#SataMcAddLeg').show();
        }
        if (MultiCity.currentLeg > 1) {
            $('#SataMcRemoveLeg').show();
        } else {
            $('#SataMcRemoveLeg').hide();
        }
    },

    updateOrigins: function() {
        $.ajax({
            url: EBOOKING_URL + 'components/getMcOrigins?lang=' + LANG +
                '&passenger=adt' + '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#origin'+MultiCity.currentLeg).html('');
                $('#origin'+MultiCity.currentLeg).html(data.html);
            }
        });
    },

    updateDestiny: function (origin, leg) {
        $.ajax({
            url: EBOOKING_URL + 'components/getDestinations?lang=' + LANG +
                '&passenger=adt' +
                '&origin=' + origin +
                '&mc=1' +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                $('#destiny'+leg).html('');
                $('#destiny'+leg).html(data.html);
            }
        });
    },

    updateDates: function (leg) {
        this.updatePeriods(leg);
        var max = new Date();
        max.setDate(max.getDate()+(356*2));
        var day = $('#chooseDate'+leg).datepicker("getDate");
        setTimeout(function(){
            while (checkMcDay(day)[0] != 1 && day < max) {
                day.setDate(day.getDate()+1);
            }
            $('#chooseDate'+leg).datepicker('setDate', day);
        }, 300);
    },

    updatePeriods: function (leg) {
        $.ajax({
            url: EBOOKING_URL + 'components/getSeasons?lang=' + LANG +
                '&passenger=adt' +
                '&origin=' + $('#origin'+leg).val() +
                '&destination=' + $('#destiny'+leg).val() +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                MultiCity.datesForLeg[leg] = data.departurePeriods;
            }
        });
    }

}

/**
 * BeforeShowDay handler on departure datepicker
 * @param day Date object
 */
function checkMcDay(day) {
    var valid = false;
    var departurePeriods = MultiCity.datesForLeg[MultiCity.currentLeg];
    if (departurePeriods != null && checkMcRouteDay(day, departurePeriods)) {
        valid = checkMcPassengerDay(day, departurePeriods);
    }
    return (valid) ?  [1,''] : [0, ''];
}

/**
 * Checks if a value exists in an array
 * @param needle The searched value.
 * @param haystack The array.
 * @param strict If the third parameter strict  is set
 * to TRUE  then the in_array() function will also
 * check the types of the needle  in the haystack.
 * @return bool TRUE if needle  is found in the array, FALSE otherwise.
 */
function in_array(needle, haystack, strict) {
    //var found = false, key; // this is stupid => aastrict = !!strict;
    for (var key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            return true;
        }
    }

    return false;
}

/**
 * Checks if a day (Date) is valid on routes in specific periodes
 * @param day Date object
 * @param per Periods object, can be departurePeriods or returnPeriods
 * @return boolean
 */
function checkMcRouteDay(day, per) {
    var valid = false;
    $.each(per.ROUTE, function() {
        if (day >= new Date(this.Start) && day <= new Date(this.End)) {
            if (in_array(day.getDay(), this.Frequency, false))
                valid = true;
        }
    });
    return valid;
}

/**
 * Checks if a day (Date) is valid on passengers in specific periods
 * @param day Date object
 * @param per Periods object, can be departurePeriods or returnPeriods
 * @return boolean
 */
function checkMcPassengerDay(day, per) {
    var valid = false;
    $.each(per.PASSENGER, function() {
        if (day >= new Date(this.Start) && day <= new Date(this.End)) {
            if (in_array(day.getDay(), this.Frequency , false))
                valid = true;
        }
    });

    return valid;
}

/**
 * General booking form object
 */
var BookingForm = {
    routeChooser: null,
    datePickers: null,
    passengerSelector: null,
    searchTypeSelector: null,
    modeSelector: null,
    eventsEnabled: true,
    checkAjax: false,

    validate: function() {
        if (!(this.routeChooser.validate() && this.passengerSelector.validate())) {
            $('#book_error_dialog').dialog('open');
            return false;
        }

        return true;
    },
    
    validationData: null,

    validateDiscount: function() {
        var url = EBOOKING_URL + '/components/checkDiscount/?';
        var query  = 'origin=' + $('#origin').val() + "&";
            query += 'destination=' + $('#destiny').val() + "&";
            query += 'passenger=' + $('#passenger').val() + "&";
            query += 'departure=' + $('#departure').val() + "&";
            query += 'return=' + $('#arrival').val() + "&";
            query += 'tripType=' + $("input[name='data[selector]']:checked").val() + "&";
            query += 'adults=' + $("#adultNumber").val() + "&";
            query += 'childs=' + $("#childNumber").val() + "&";
            query += 'infants=' + $("#infantNumber").val() + "&";
            query += 'discount=' + $("#tourCode").val() + "&";
            query += 'lang_id=' + siteLang + "&";
            query += 'callback=?';
         url += query;
         $.ajax({
             url: url,
             cache: false,
             dataType: 'jsonp',
             success: function (data) {
                 BookingForm.validationData = data;
                 BookingForm.checkDiscount(data);
             }
         });
         return false;
    },

    checkDiscount: function (data) {
        $('#book_error_dialog li').hide();
         $('#conditionsBlock').show();

         if (!data.Valid) {
            if (!data.Route)
                $('#discount_route').show();

            if (!data.TripType)
                $('#discount_tripType').show();

            if (!data.Dates)
                $('#discount_dates').show();

            if (!data.PassengerTypeNumber)
                $('#discount_number').show();

            if (!data.Passenger)
                $('#discount_passenger').show();

            if (!data.Usage)
                $('#discount_usage').show();

            if (!data.Exists) {
                $('#discount_not_valid').show();
                $('#conditionsBlock').hide();
                $('#book_error_dialog').dialog('open');
                return false;
            }

            $('#discount_conditions').html(data.Conditions);
            $('#conditionsBlock').show();
            $('#book_error_dialog').dialog('open');
            return false;
        }

        $('#SataBookingFormElement').submit();

        return true;
    },
    
    /**
     * Load the booking form and place the contents in 'container'
     */
    load: function(container) {
        $.ajax({
            url: EBOOKING_URL + '/components/getForm/bookingForm/'+PARTNER_ID+'/'+use_discount+'/?lang=' + LANG + '&callback=?',
            cache: false,
            dataType: 'jsonp',
            success: function(data) {
                $('#' + container).html(data.form);
                BookingForm.startUp();
            }
        });
    },

    /**
     * Start booking form application
     */
    startUp: function() {
        $('#SataStoreMc').val(PARTNER_ID);
        $('#partnerUrlMc').val(PARTNER_URL);
        $('#partnerLogoMc').val(PARTNER_LOGO);
        $('#SataStore').val(PARTNER_ID);
        $('#partnerUrl').val(PARTNER_URL);
        $('#partnerLogo').val(PARTNER_LOGO);

        $('#SataBookingFormElement').submit(function() {
           var form = document.getElementById('SataBookingFormElement');
           try {form.value = firstTracker._linkByPost(form);} catch (e){}
           try {form.value = secondTracker._linkByPost(form);} catch (e){}
           try {form.value = thirdTracker._linkByPost(form);} catch (e){}
           
            return BookingForm.validate();
            //
        });

        $('#SataFormSubmitBtn').click(function() {
            origin = $('#origin').val();
            destination = $('#destiny').val();

            if ($('#tourCode').val().length > 0 ) {
                return BookingForm.validateDiscount();
            }

            if (origin == 'FRA') {
                $('#originQYG').val('TRUE');
                $('#destinationQYG').val('FALSE');
                $('#qyg_dialog').dialog('open');
            } else if (destination == 'FRA') {
                $('#originQYG').val('FALSE');
                $('#destinationQYG').val('TRUE');
                $('#qyg_dialog').dialog('open');
            } else {
                return true;
            }

            return false;
        });

        $('#edit-sata-booking-form-submit').click(function() {
            origin = $('#origin').val();
            destination = $('#destiny').val();

            if ($('#tourCode').val().length > 0 ) {
                return BookingForm.validateDiscount();
            }

            if (origin == 'FRA') {
                $('#originQYG').val('TRUE');
                $('#destinationQYG').val('FALSE');
                $('#qyg_dialog').dialog('open');
            } else if (destination == 'FRA') {
                $('#originQYG').val('FALSE');
                $('#destinationQYG').val('TRUE');
                $('#qyg_dialog').dialog('open');
            } else {
                return true;
            }

            return false;
        });

        $('#book_error_dialog').dialog({
            bgiframe: true,
            resizable: true,
            modal: true,
            autoOpen: false,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
            },
            buttons: {
                'Ok': function() {
                    $(this).dialog('close');
                }
            }
        });

        this.routeChooser = new RouteChooser();
        this.routeChooser.addObserver(this);
        this.datePickers = new DatePickers('doble');
        this.datePickers.startUp();
        this.passengerSelector = new PassengerSelector();
        this.passengerSelector.addObserver(this);
        this.searchTypeSelector = new SearchTypeSelector();
        this.modeSelector = new ModeSelector();
        this.modeSelector.addObserver(this);

        $('#multiCity').click(function() {
            if (!$('#SataMCityContainer').is(':visible'))
                BookingForm.showMcity(true);
        });

        $('#SataMcRemoveLeg').hide();

        $('#SataMcAddLeg').click(function () {
            if (MultiCity.checkLeg()) {
                MultiCity.currentLeg++;
                MultiCity.addLeg();
            }
        });

        $('#SataMcRemoveLeg').click(function() {
           MultiCity.removeLeg();
        });

        $('#SataExitMc').click(function(){
            MultiCity.reset();
            BookingForm.showMcity(false);
        });

        $('#SataMcReset').click(function() {
            MultiCity.reset();return false;
        });

        $('#SataMcSubmit').click(function(){
            if (MultiCity.checkLeg()) {
                MultiCity.enableAll();
                return true;
            }
            
            return false;
        });
    },

    showMcity: function(show) {
        if (show){
            $('#SataOverBooking').show();
            $('#SataMCityContainer').show();
            $('#SataFormHolder').hide();
            MultiCity.setup();
        } else {
            $('#SataOverBooking').hide();
            $('#SataMCityContainer').hide();
            $('#SataFormHolder').show();
        }
    },

    setupForm: function(values) {
        this.eventsEnabled = false;
        this.passengerSelector.setPassengerForRoute(values.passengerType, values.origin, values.destiny);
        this.routeChooser.setRoute(values.origin, values.destiny);

        setTimeout(function() {
            BookingForm.eventsEnabled = true;
            BookingForm.updatePeriods();
            BookingForm.refreshRules();

            if (values.departure)
                BookingForm.datePickers.setDepartureDate(values.departure);

            if (values.return_date)
                BookingForm.datePickers.setReturnDate(values.return_date);

            setTimeout(function() {
                if (values.roundTrip) {
                    $('#roundTrip').attr('checked', true);
                    $('#roundTrip').click();
                } else if (values.oneWay) {
                    $('#oneWay').attr('checked', true);
                    $('#oneWay').click();
                }
            }, 600);
        }, 1500);
    },

    /**
     * Event listner
     */
    update: function(objectName, event) {
        if (BookingForm.eventsEnabled) {
            if ((objectName == 'RouteChooser') && (event == 'routeChanged')) {
                this.updatePeriods();
                this.passengerSelector.routeChanged(this.routeChooser.getOrigin(), this.routeChooser.getDestination());
                this.refreshRules();
            }
            if ((objectName == 'ModeSelector') && (event == 'roundTrip')) {
                this.datePickers.setReturn(true);
            }
            if ((objectName == 'ModeSelector') && (event == 'oneWay')) {
                this.datePickers.setReturn(false);
            }
            if ((objectName == 'PassengerSelector') && (event == 'passChanged')) {
                this.routeChooser.setPassengerType(this.passengerSelector.getPassengerType());
                this.refreshRules();
            }
        }
    },

    /**
     * Update date periods
     */
    updatePeriods: function() {
        $.ajax({
            url: EBOOKING_URL + 'components/getSeasons?lang=' + LANG +
                '&passenger=' + this.passengerSelector.getPassengerType() +
                '&origin=' + this.routeChooser.getOrigin() +
                '&destination=' + this.routeChooser.getDestination() +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                BookingForm.datePickers.setDeparturePeriods(data.departurePeriods)
                BookingForm.datePickers.setReturnPeriodes(data.returnPeriods)
                BookingForm.datePickers.updateDates();
            }
        });
    },
    applyRules: function(Rules) { 
        if (!Rules.OneWay) {
            BookingForm.modeSelector.disableOneWay();
        } else {
            BookingForm.modeSelector.enableOneWay();
        }

        if (!Rules.RoundTrip) {
            BookingForm.modeSelector.disableRoundTrip();
        } else {
            BookingForm.modeSelector.enableRoundTrip();
        }
       
        if (!Rules.FlexibleDates)
            BookingForm.searchTypeSelector.disableFlexibleDates(true);
        else
            BookingForm.searchTypeSelector.setFlexibleDates(true);

        BookingForm.passengerSelector.setAdultMaxNumber(Rules.Adults);
        BookingForm.passengerSelector.setChildMaxNumber(Rules.Childs);
        BookingForm.passengerSelector.setInfantMaxNumber(Rules.Infants);
    }, 
    refreshRules: function() {
        $.ajax({
            url: EBOOKING_URL + 'components/getUpdatedRules?lang=' + LANG +
                '&passenger=' + this.passengerSelector.getPassengerType() +
                '&origin=' + this.routeChooser.getOrigin() +
                '&destination=' + this.routeChooser.getDestination() +
                '&store=' + PARTNER_ID + '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(Rules) {
                BookingForm.applyRules(Rules);
                $('#adultNumber').change();
                /*
                if (!Rules.OneWay) {
                    BookingForm.modeSelector.disableOneWay();
                } else {
                    BookingForm.modeSelector.enableOneWay();
                }

                if (!Rules.RoundTrip) {
                    BookingForm.modeSelector.disableRoundTrip();
                } else {
                    BookingForm.modeSelector.enableRoundTrip();
                }

                if (!Rules.FlexibleDates)
                    BookingForm.searchTypeSelector.disableFlexibleDates(true);

                BookingForm.passengerSelector.setAdultMaxNumber(Rules.Adults);
                BookingForm.passengerSelector.setChildMaxNumber(Rules.Childs);
                BookingForm.passengerSelector.setInfantMaxNumber(Rules.Infants);
                */
            }
        });
    }
}


var AwardForm = {

  routeChooser: null,
  datePickers: null,
  modeSelector: null,
  passengerSelector: null,
  searchTypeSelector: null,

  startUp: function() {
      $('#SataStoreMc').val(PARTNER_ID);
      $('#partnerUrlMc').val(PARTNER_URL);
      $('#partnerLogoMc').val(PARTNER_LOGO);
      $('#SataStore').val(PARTNER_ID);
      $('#partnerUrl').val(PARTNER_URL);
      $('#partnerLogo').val(PARTNER_LOGO);
      this.routeChooser = new RouteChooser();
      this.routeChooser.addObserver(this);
      this.routeChooser.isAward();
      this.datePickers = new DatePickers('doble');
      this.datePickers.startUp();
      this.modeSelector = new ModeSelector();
      this.modeSelector.addObserver(this);
      this.passengerSelector = new PassengerSelector();
      this.searchTypeSelector = new SearchTypeSelector();
      //$("#flexPriceYes").attr('checked', true);

      $('#edit-sata-booking-form-submit').click(function() {
         var form = document.getElementById('SataBookingFormElement');
         try {form.value = firstTracker._linkByPost(form);} catch (e){}
         try {form.value = secondTracker._linkByPost(form);} catch (e){}
         try {form.value = thirdTracker._linkByPost(form);} catch (e){}

          return AwardForm.validate();
          //
      });

      $('#book_error_dialog').dialog({
          bgiframe: true,
          resizable: true,
          modal: true,
          autoOpen: false,
          overlay: {
              backgroundColor: '#000',
              opacity: 0.5
          },
          buttons: {
              'Ok': function() {
                  $(this).dialog('close');
              }
          }
      });

      
  },
validate: function() {
        if (!(this.routeChooser.validate())) {
            $('#book_error_dialog').dialog('open');
            return false;
        }

        return true;
    },
  update: function(objectName, event) {
      if ((objectName == 'RouteChooser') && (event == 'routeChanged')) {
          this.updatePeriods();
      }
      if ((objectName == 'ModeSelector') && (event == 'roundTrip')) {
          this.datePickers.setReturn(true);
      }
      if ((objectName == 'ModeSelector') && (event == 'oneWay')) {
          this.datePickers.setReturn(false);
      }
  },
  updatePeriods: function() {
      $.ajax({
          url: EBOOKING_URL + 'components/getSeasons?lang=' + LANG +
              '&passenger=adt' +
              '&origin=' + this.routeChooser.getOrigin() +
              '&destination=' + this.routeChooser.getDestination() +
              '&callback=?',
          cache: false,
          dataType: "jsonp",
          success: function(data) {
              AwardForm.datePickers.setDeparturePeriods(data.departurePeriods);
              AwardForm.datePickers.setReturnPeriodes(data.returnPeriods)
              AwardForm.datePickers.updateDates();
          }
      });
  },
  applyRules: function(Rules) {
        if (!Rules.OneWay) {
            AwardForm.modeSelector.disableOneWay();
        } else {
            AwardForm.modeSelector.enableOneWay();
        }

        if (!Rules.RoundTrip) {
            AwardForm.modeSelector.disableRoundTrip();
        } else {
            AwardForm.modeSelector.enableRoundTrip();
        }

        if (!Rules.FlexibleDates)
            AwardForm.searchTypeSelector.disableFlexibleDates(true);
        else
            AwardForm.searchTypeSelector.setFlexibleDates(true);

        AwardForm.passengerSelector.setAdultMaxNumber(Rules.Adults);
        AwardForm.passengerSelector.setChildMaxNumber(Rules.Childs);
        //AwardForm.passengerSelector.setInfantMaxNumber(Rules.Infants);
    }
}


function isAjaxDone() {
    return BookingForm.checkAjax;
}

/*      Map functions           */
function showMap(award) {
    var obj = new FlashObject(EBOOKING_URL + "flash/mapa/flash/mapa_2.swf", "MapaRotas", "624", "440", "8", "#FFFFFF");
    if (LANG == 'pt_PT')
        obj.addVariable("dataSource_airports", EBOOKING_URL + "xmldata/airports/pt");
    else
        obj.addVariable("dataSource_airports", EBOOKING_URL + "xmldata/airports/en");

    if (award)
      obj.addVariable("dataSource_routes", EBOOKING_URL + "flash/mapa/xml/sata_award_routes.xml");
    else
      obj.addVariable("dataSource_routes", EBOOKING_URL + "flash/mapa/xml/sata_" + $('#passenger').val() + "_routes.xml");

    if (LANG == 'pt_PT')
        obj.addVariable("dataSource_configs", EBOOKING_URL + "flash/mapa/xml/sata_configs.xml");
    else if (LANG == 'de_DE')
        obj.addVariable("dataSource_configs", EBOOKING_URL + "flash/mapa/xml/sata_configs_de.xml");
    else
        obj.addVariable("dataSource_configs", EBOOKING_URL + "flash/mapa/xml/sata_configs_en.xml");

    obj.addParam("ID", "MapaRotas");
    obj.addParam("swLiveConnect", "true");
    obj.addParam("allowScriptAccess", "always");
    obj.write("bookingFormMap");
}

function updateSelPartida(AirportCode) {
    //Envia o código do aeroporto de partida, do flash para o formulário, para actualizar o campo do formulário.
    document.getElementById('origin').value = AirportCode;
    $('#origin').change();
}

function updateSelDestino(AirportCode) {
    //Envia o código do aeroporto de destino, do flash para o formulário, para actualizar o campo do formulário.
    document.getElementById('destiny').value = AirportCode;
    $('#destiny').change();
}

var Ruller = {
    rule: null,
    run: function(rl) {
        if ($('#sataBookingForm').length > 0) {
            Ruller.applyRule(rl);
        } else {
            $('.booking').click();
            setTimeout(function() {
                Ruller.applyRule(rl);
            }, 2000);
        }
        /*
        eval('var rul = ' + rl);
        this.rule = rul;

        BookingForm.setupForm(this.rule);
        */
        //this.updateForm();
        /*
        setTimeout(function() {
            BookingForm.eventsEnabled = false;
            BookingForm.update('RouteChooser', 'routeChanged');
        }, 1500);*/
    },
    applyRule: function(rl) {
        eval('var rul = ' + rl);
        this.rule = rul;
        BookingForm.setupForm(this.rule);
    },
    updateForm: function() {
        if (Ruller.rule != null) {
            setTimeout(function() {
                Ruller.changePassenger(Ruller.rule);
                Ruller.applyCityPar(Ruller.rule);
                Ruller.checkTripType(Ruller.rule);
                Ruller.rule = null;
            }, 200);
        }
    },
    applyCityPar: function(rule) {
        setTimeout(function() {Ruller.checkOrigin(rule)}, 550);
        setTimeout(function() {Ruller.checkDestiny(rule);}, 750);
    },
    checkOrigin: function(rule) {
        if (typeof(rule.origin) != 'undefined') {
            $('#origin').val(rule.origin);
            $('#origin').change();
        }
    },
    checkDestiny: function(rule) {
        if (typeof(rule.destiny) != 'undefined') {
            var inter = setInterval(function() {
                if (document.getElementById('destiny').length > 1) {
                    $('#destiny').val(rule.destiny);
                    $('#destiny').change();
                    Ruller.checkDeparture(rule);
                    clearInterval(inter);
                }
            }, 350);
        } else {
            alert("Red Alert!");
        }
    },
    checkTripType: function(rule) {
        if (typeof(rule.roundTrip) != 'undefined') {
            if (rule.roundTrip) {
                $('#roundTrip').attr('checked', true);
                $('#roundTrip').click();
            } else {
                $('#oneWay').attr('checked', true);
                $('#oneWay').click();
            }
        }
    },
    checkDeparture: function(rule){
        if (typeof(rule.departure) != 'undefined') {
            $('#chooseDeparture').datepicker( 'enable' );
            var date = new Date();
            date.setFullYear(rule.departure.year, rule.departure.month-1, rule.departure.day);
            setTimeout(function() {
                $('#chooseDeparture').datepicker( 'setDate' , date );
                setTimeout(function() {
                    $('#chooseArrival').datepicker('option', 'minDate', date);
                    Ruller.checkReturn(rule);
                }, 350);
            }, 500);
        }
    },
    checkReturn: function(rule) {
        $('#chooseArrival').datepicker( 'enable' );
        if (typeof(rule.return_date) != 'undefined') {
            var date = new Date();
            date.setFullYear(rule.return_date.year, rule.return_date.month-1, rule.return_date.day);
            setTimeout(function() {
                $('#chooseArrival').datepicker('setDate' , date );
            }, 350);
        }
    },
    changePassenger: function(rule) {
        if (typeof(rule.passengerType) != 'undefined') {
            $('#passenger').val(rule.passengerType);
            $('#passenger').change();
        }
    }
}

var StatusForm = {
    routeChooser: null,
    datePickers: null,
    update: function(objectName, event) {
        if ((objectName == 'RouteChooser') && (event == 'routeChanged')) {
            this.updatePeriods();
        }
    },
    updatePeriods: function() {
        $.ajax({
            url: EBOOKING_URL + 'components/getSeasons?lang=' + LANG +
                '&passenger=adt' +
                '&origin=' + this.routeChooser.getOrigin() +
                '&destination=' + this.routeChooser.getDestination() +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                StatusForm.datePickers.setDeparturePeriods(data.departurePeriods);
                StatusForm.datePickers.updateDates();
            }
        });
    },
    load: function(container) {
        $.ajax({
            url: EBOOKING_URL + '/components/getForm/flightStatus/?lang=' + LANG + '&callback=?',
            cache: false,
            dataType: 'jsonp',
            success: function(data) {
                $('#' + container).html(data.form);
                StatusForm.startUp();
            }
        });
        /*
        $('#' + container).load(EBOOKING_URL + '/components/flightStatus/?lang='+LANG, function() {
            StatusForm.startUp();
        });*/
    },
    startUp: function() {
        this.routeChooser = new RouteChooser();
        this.routeChooser.addObserver(this);
        this.datePickers = new DatePickers('single', true);
        this.datePickers.startUp();

        $("#fstat_error_dialog").dialog({
            bgiframe: true,
            resizable: true,
            modal: true,
            autoOpen: false,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
            },
            buttons: {
                'Ok': function() {
                    $(this).dialog('close');
                }
            }
        });

        $("#sata-schedule-flight-status-form").submit(function() {
            return StatusForm.validateForm();
        });

        $("#number").focus(function() {
            StatusForm.updatePicker();
        });

        $('#method_number').click(function(){
            StatusForm.updatePicker();
        });
        
        $("#origin").focus(function() {$('#method_route').attr('checked', true);});
        $("#destiny").focus(function() {$('#method_route').attr('checked', true);});
        $("#showMapLink").click(function(){$('#method_route').attr('checked', true);});
    },
    updatePicker: function() {
        $('#method_number').attr('checked', true);
        var periods = {
            "departurePeriods":{
                "ROUTE":[
                    {"Start":"January 1, 1999 00:00:00","End":"December 31, 2100 00:00:00","Frequency":["0","1","2","3","4","5","6"]}
                ],
                "PASSENGER":[
                    {"Start":"January 1, 1999 00:00:00","End":"December 31, 2100 00:00:00","Frequency":["0","1","2","3","4","5","6"]}
                ]
            }
        };
        StatusForm.datePickers.setDeparturePeriods(periods.departurePeriods);
        StatusForm.datePickers.updateDates();
    },
    validateForm: function() {
        var method = $("input[name='method']:checked").val();

        $("#method_error").hide();
        $("#fnum_error").hide();
        $("#route_origin_error_pp").hide();
        $("#route_destination_error_pp").hide();
        $("#date_error").hide();

        if (method == "number") {
            if (!(StatusForm.validateFlightNumber() && StatusForm.validateDate())) {
                $("#fstat_error_dialog").dialog('open');
                return false;
            }

            return true;
        } else if (method == "route") {
            if (!(StatusForm.validateRoute() && StatusForm.validateDate())) {
                $("#fstat_error_dialog").dialog('open');
                return false;
            }

            return true;
        }

        $("#method_error").show();
        $("#fstat_error_dialog").dialog('open');

        return false;
    },

    validateDate: function () {
         var date = $("#chooseDeparture").datepicker('getDate');

         if (date == 'undefined') {
             $("#date_error").show();
             return false;
         }

         return true;
     },

     validateFlightNumber: function () {
         var expression = new RegExp("(S4|SP)(\\d{3,4})", "i");
         var flightNumber = $("#number").val();

         if (!expression.test(flightNumber)) {
             $("#fnum_error").show();
             return false;
         }

         return true;
     },

     validateRoute: function () {
         var dep = $("#origin").val();
         var arr = $("#destiny").val();
         var ok = true;

         if (dep == 0) {
             $("#route_origin_error_pp").show();
             ok = false;
         }

         if (arr == 0) {
             $("#route_destination_error_pp").show();
             ok = false;
         }

         return ok;
     }
}

var ScheduleForm = {
    routeChooser: null,
    datePickers: null,
    modeSelector: null,
    load: function(container) {
        $.ajax({
            url: EBOOKING_URL + '/components/getForm/flightSchedule/?lang=' + LANG + '&callback=?',
            cache: false,
            dataType: 'jsonp',
            success: function(data) {
                $('#' + container).html(data.form);
                ScheduleForm.startUp();
            }
        });
        /*
        $('#' + container).load(EBOOKING_URL + '/components/flightSchedule/?lang='+LANG, function() {
            ScheduleForm.startUp();
        });*/
    },
    startUp: function() {
        this.routeChooser = new RouteChooser();
        this.routeChooser.addObserver(this);
        this.datePickers = new DatePickers('doble');
        this.datePickers.startUp();
        this.modeSelector = new ModeSelector();
        this.modeSelector.addObserver(this);

        $('#sched_error_dialog').dialog({
            bgiframe: true,
            resizable: true,
            modal: true,
            autoOpen: false,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
            },
            buttons: {
                'Ok': function() {
                    $(this).dialog('close');
                }
            }
        });

        $('#sata-schedule-flight-schedule-form').submit(function() {
            return ScheduleForm.validate();
        });
    },
    validate: function() {
        $("#route_origin_error_ppp").hide();
        $("#route_destination_error_ppp").hide();
        var dep = $("#origin").val();
         var arr = $("#destiny").val();
         var ok = true;

         if (dep == 0) {
             $("#route_origin_error_ppp").show();
             ok = false;
         }

         if (arr == 0) {
             $("#route_destination_error_ppp").show();
             ok = false;
         }
         if (!ok) {
             $('#sched_error_dialog').dialog('open');
         }

         return ok;
    },
    update: function(objectName, event) {
        if ((objectName == 'RouteChooser') && (event == 'routeChanged')) {
            this.updatePeriods();
        }
        if ((objectName == 'ModeSelector') && (event == 'roundTrip')) {
            this.datePickers.setReturn(true);
        }
        if ((objectName == 'ModeSelector') && (event == 'oneWay')) {
            this.datePickers.setReturn(false);
        }
    },
    updatePeriods: function() {
        $.ajax({
            url: EBOOKING_URL + 'components/getSeasons?lang=' + LANG +
                '&passenger=adt' +
                '&origin=' + this.routeChooser.getOrigin() +
                '&destination=' + this.routeChooser.getDestination() +
                '&callback=?',
            cache: false,
            dataType: "jsonp",
            success: function(data) {
                ScheduleForm.datePickers.setDeparturePeriods(data.departurePeriods);
                ScheduleForm.datePickers.setReturnPeriodes(data.returnPeriods)
                ScheduleForm.datePickers.updateDates();
            }
        });
    }
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

var CheckMyTrip = {
    load: function(container) {
        $.ajax({
            url: EBOOKING_URL + '/components/getForm/checkMyTrip/?lang=' + LANG + '&callback=?',
            cache: false,
            dataType: 'jsonp',
            success: function(data) {
                $('#' + container).html(data.form);
                CheckMyTrip.setup();
            }
        });
        /*
        $('#' + container).load(EBOOKING_URL + '/components/checkMyTrip/?lang='+LANG, function() {
            CheckMyTrip.setup();
        });*/
    },

    setup: function() {
        CheckMyTrip.setupDialog();
        $('#sata_check_my_trip').submit(function(){
            return CheckMyTrip.validate();
        });
        
    },

    setupDialog: function() {
        $("#cmt_dialog").dialog({
            bgiframe: true,
            resizable: true,
            modal: true,
            autoOpen: false,
            overlay: {
                backgroundColor: '#000',
                opacity: 0.5
            },
            buttons: {
                'Ok': function() {
                    $(this).dialog('close');
                }
            }
        });
    },

    validate: function() {
        var name = CheckMyTrip.sanitizeName($('#DIRECT_RETRIEVE_LASTNAME').val());

        $('#DIRECT_RETRIEVE_LASTNAME').val(name);

        var ok = CheckMyTrip.validatePNR();
        ok &= CheckMyTrip.validateName(name);

        if (!ok) {
            $("#cmt_dialog").dialog('open');
            return false;
        }
        return true;
    },
    validatePNR: function() {
        validPNR = new RegExp("^[0-9, a-z, A-Z]{6}$");
        pnr = $('#REC_LOC').val();
        pnrMsg = $("#InvalidPNR_Msg");

        if (!validPNR.test(pnr)) {
            pnrMsg.show();
            return false;
        }

        pnrMsg.hide();
        return true;
    },
    validateName: function(name) {
        required = new RegExp(".+");
        nameMsg = $('#InvalidName_Msg');

        if (!required.test(name)) {
            nameMsg.show();
            return false;
        }

        nameMsg.hide();
        return true;
    },
    sanitizeName: function(name) {
        var temp = name;

        var bad = [ 
            /[\xC0-\xC4]/g, /[\xE0-\xE4]/g, // A, a
            /[\xC8-\xCA]/g, /[\xE8-\xEB]/g, // E, e
            /[\xCC-\xCE]/g, /[\xEC-\xEE]/g, // I, i
            /[\xD2-\xD6]/g, /[\xF2-\xF6]/g, // O, o
            /[\xD9-\xDB]/g, /[\xF9-\xFB]/g, // U, u
            /[\xC7]/g, /[\xE7]/g            // C, c
        ];

        var good = ['A','a','E','e','I','i','O','o','U','u', 'C', 'c'];

        for (var i = 0; i < bad.length; i++)
            temp = temp.replace(bad[i], good[i]);

        return temp;
    }
}


/*      END Map functions       */

/** application Startup  **/
$(document).ready(function() {
    //MODALS
    $('.modal_trigger').live('click',function(evt) {
        evt.preventDefault();

        var modal = $(this).parent().find('.modal_wrapper');
        var newModal = modal.clone();

        newModal.attr('id','newModal').css({'left':'50%','top':'50%','margin-left':-modal.width()/2+'px','margin-top':-(modal.height()/2)-20+'px'}).appendTo('body');
        $('#newModal').show();

        function hideModal(){
            $('#newModal').remove();
            $('body').unbind('keydown');
        }
            
        $('.modal_wrapper .modal_close, .modal_wrapper .modal_overlay').click(function(evt) {
            evt.preventDefault();
            hideModal();
        });

        $('body').keydown(function(evt) {
            if (evt.keyCode==27)
                hideModal();
        });
    });

    //CUSTOM MAP MODAL
    $('#showMapLink').live('click',function(evt) {
        evt.preventDefault();

        var html = $('#SataMapContainer').html();

        $('#origin').val(0);
        $('#destiny').val(0);

        $('#SataMapContainer').html('<div class="modal_overlay"></div><a class="modal_close">fechar</a><div class="modal_content">'+html+'<div class="submit_bg"><input class="submit" type="image" src="https://www.sata.pt/sites/all/themes/sata/images/layout/'+siteLang+'/bt_confirmar.png" /></div><div class="clear"></div></div>').show();

        function hideMapLink() {
            $('#SataMapContainer').hide().html(html);
            $(window).unbind('keydown');
        }

        $('#SataMapContainer .modal_close, #SataMapContainer .modal_overlay, #SataMapContainer .submit').click(function(evt){
            evt.preventDefault();
            hideMapLink();
        });

        $('body').keydown(function(evt) {
            if (evt.keyCode==27)
                hideMapLink();
        });
    });
});

