/**
 * Travel Insurance form
 *
 * @author          Ryan Blunden, Jonothan Barton
 * @modifiedby      $LastChangedBy: warrens $
 * @copyright       Copyright Flight Centre Ltd. All rights reserved.
 * @version         $Revision: 16300 $
 * @lastmodified    $Date: 2011-12-12 09:39:23 +1000 (Mon, 12 Dec 2011) $
 * @requires        FC, FCL
 */
 
;ET.INSURANCE = 
{
    minYear: 1900,
    
    maxYear: 2100,
    
    $form: null,

    fieldMappings: 
    {
        ResidencyFlag: 'Travellers live in Australia',
        Area: 'Area of Travel',
        Country: 'Country Most Time Spent In',
        StartDate: 'Departure date',
        EndDate: 'Return date',
        age1: 'Traveller ages',
        age2: 'Traveller ages',
        age3: 'Traveller ages',
        age4: 'Traveller ages',
        age5: 'Traveller ages',
        age6: 'Traveller ages'
    },
    
    multiTripRegions: 
    [
        { display: 'Worldwide', value: 1  },
        { display: 'Restricted Worldwide', value: 2 },
        { display: 'Australia', value: 5 }
    ],
    
    singleTripRegions: 
    [
        { display: 'Worldwide (inc. Americas and Africa)', value: 1 }, 
        { display: 'Europe, Asia and the Middle East', value: 2 },  
        { display: 'UK and South East Asia', value: 3 },  
        { display: 'Indonesia, NZ and South West Pacific', value: 4 }, 
        { display: 'Australia', value: 5 }//,
        /**** 2011-12-05 bannert: Disabling selection of inbound trips until CoverMore bug fix has been rolled out. ****/
        //{ display: 'Inbound to Australia', value: 6 }
    ],
    
    areaTravel:
    [
        ["Afghanistan","Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica (Cruising)","Antigua and Barbuda","Antilles","Argentina","Armenia","Aruba","Ascension Island","Austria","Azerbaijan","Azores","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia","Botswana","Brazil","Brunei","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Canary Islands","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Colombia","Comoros","Congo (Republic of)","Cook Islands","Costa Rica","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Domestic Cruise","Dominica","Dominican Rep.","East Timor","Ecuador","Egypt","El Salvador","England","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands","Faroe Islands","Federated States of Micronesia","Fiji","Finland","France","French Guiana","French Polynesia","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey (Channel Islands)","Guinea","Guinea-Bissau","Guyana","Haiti","Herzegovina","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran","Iraq","Israel","Italy","Ivory Coast","Jamaica","Japan","Jersey (Channel Island)","Jordan","Kazakhstan","Kenya","Kiribati","Korea (north)","Korea (south)","Kosovo","Kuwait","Kyrgyzstan","Laos","Latvia","Lebanon","Lesotho","Liberia","Libya","Liechtenstein","Lithuania","Luxembourg","Macau","Macedonia","Madagascar","Madeira","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mexico","Moldova","Monaco","Mongolia","Montenegro","Morocco","Mozambique","Myanmar (Burma)","Namibia","Nauru","Nepal","Netherlands Antilles","Netherlands","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Norfolk Island","Northern Ireland","Northern Marianas","Norway","Oman","Pakistan","Palau","Palestine","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Puerto Rico","Qatar","Republic of Ireland","Reunion","Romania","Russia","Rwanda","Samoa","San Marino","SÃƒÂ£o TomÃƒÂ© and PrÃƒÂ­ncipe","Saudi Arabia","Scotland","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Korea","South West Pacific Cruise","Spain","Sri Lanka","St. Kitts-Nevis","St. Lucia","St. Vincent & Grenadines","Sudan","Suriname","Swaziland","Sweden","Switzerland","Syria","Taiwan","Tajikistan","Tanzania","Thailand","Togo","Tonga","Trinidad & Tobago","Tunisia","Turkey","Turkmenistan","Tuvalu","Uganda","Ukraine","United Arab Emirates","United States of America","Uruguay","Uzbekistan","Vanuatu","Vatican City","Venezuela","Vietnam","Virgin Islands","Wales","Western Samoa","Yemen","Zaire","Zambia","Zimbabwe"],
        ["Afghanistan","Albania","American Samoa","Andorra","Armenia","Austria","Azerbaijan","Bahrain","Bangladesh","Belarus","Belgium","Bhutan","Bosnia","Brunei","Bulgaria","Cambodia","Canary Islands","China","Cook Islands","Croatia","Cyprus","Czech Republic","Denmark","Domestic Cruise","East Timor","England","Estonia","Faroe Islands","Federated States of Micronesia","Fiji","Finland","France","French Polynesia","Georgia","Germany","Gibraltar","Greece","Guam","Guernsey (Channel Islands)","Herzegovina","Hong Kong","Hungary","Iceland","India","Indonesia","Iran","Iraq","Israel","Italy","Japan","Jersey (Channel Island)","Jordan","Kazakhstan","Kiribati","Korea (north)","Korea (south)","Kosovo","Kuwait","Kyrgyzstan","Laos","Latvia","Lebanon","Liechtenstein","Lithuania","Luxembourg","Macau","Macedonia","Madeira","Malaysia","Maldives","Malta","Marshall Islands","Moldova","Monaco","Mongolia","Montenegro","Myanmar (Burma)","Nauru","Nepal","Netherlands","New Caledonia","New Zealand","Norfolk Island","Northern Ireland","Northern Marianas","Norway","Oman","Pakistan","Palau","Palestine","Papua New Guinea","Philippines","Poland","Portugal","Qatar","Republic of Ireland","Romania","Russia","Samoa","San Marino","Saudi Arabia","Scotland","Serbia","Singapore","Slovakia","Slovenia","Solomon Islands","South Korea","South West Pacific Cruise","Spain","Sri Lanka","Sweden","Switzerland","Syria","Taiwan","Tajikistan","Thailand","Tonga","Turkey","Turkmenistan","Tuvalu","Ukraine","United Arab Emirates","Uzbekistan","Vanuatu","Vatican City","Vietnam","Wales","Western Samoa","Yemen"],
        ["American Samoa","Brunei","Cambodia","Cook Islands","Domestic Cruise","East Timor","England","Federated States of Micronesia","Fiji","French Polynesia","Guam","Guernsey (Channel Islands)","Indonesia","Jersey (Channel Island)","Kiribati","Laos","Malaysia","Marshall Islands","Myanmar (Burma)","Nauru","New Caledonia","New Zealand","Norfolk Island","Northern Ireland","Northern Marianas","Palau","Papua New Guinea","Philippines","Republic of Ireland","Samoa","Scotland","Singapore","Solomon Islands","South West Pacific Cruise","Thailand","Tonga","Tuvalu","Vanuatu","Vietnam","Wales","Western Samoa"],
        ["American Samoa","Cook Islands","Domestic Cruise","East Timor","Fiji","French Polynesia","Indonesia","Kiribati","Nauru","New Caledonia","New Zealand","Norfolk Island","Papua New Guinea","Samoa","Solomon Islands","South West Pacific Cruise","Tonga","Tuvalu","Vanuatu","Western Samoa"],
        ["Antarctica-Sightseeing Flight","Australia"]
    ],
 
    init: function(insuranceForm)
    {
        this.$form = $('#travelInsuranceForm');
        this.prettyPhoto();
        this.setupForm();
        this.setupValidation();
        this.setupPopups();
    },
 
    prettyPhoto: function()
    {
        // Initialise Pretty Photo
        $('a[rel="prettyPhoto"]').prettyPhoto();
    },
    
    
    setupForm: function()
    {
         
        // Remove "hide" class on  #singleMultiTripContainer if on home page
        //$('#searchForms #singleMultiTripContainer').removeClass('hide');
        
        // Reset all form elements to default values
        this.$form.find('#singleMultiTripContainer input:first').attr('checked', 'checked');
        //$('#insuranceFormTabs a:first').addClass('selectedTab');
        this.$form.find('select option:first').attr('selected', 'selected');
        
        // Fire this manually at setup time to get select elements populated with default values (Single Trip)
        this.populateRegions();
        
        // We need a custom setup for the tabs on the Travel Insurance page
        /*
        $('#insuranceFormTabs a').bind('click', function(e)
        {
            var index = $('#insuranceFormTabs li a').index($(this));
            ET.INSURANCE.$form.find('#singleMultiTripContainer input:eq('+ index +')').attr('checked', 'checked');
            ET.INSURANCE.singleMultiSwitch();
        });
        */
        
        // We need to target the li as it's the only thing that worked reliably on IE6
        
        this.$form.find('#singleMultiTripContainer li,#in_singleTrip,#in_multiTrip').bind('click', function(e) 
        {
            ET.INSURANCE.singleMultiSwitch(); 
        });
        
        // If traveller doesn't live in Australia, "Inbound to Australia"" is the only option
        this.$form.find('#in_liveinCountry').bind('change', function(e) { ET.INSURANCE.changeCountryByTravellersLiveAustralia(); });
        
        /**** 2011-12-05 bannert: Disabling selection of inbound trips until CoverMore bug fix has been rolled out. ****/
        this.$form.find('#in_leisureRegion').bind('change', function(e) { ET.INSURANCE.changeCountryRegionChange(); });

        this.$form.find('.age_field').bind('blur', function(e){
            $('#travellers_concat').val($('#leisure_traveller_1').val()+','
                                        +$('#leisure_traveller_2').val()+','
                                        +$('#leisure_traveller_3').val()+','
                                        +$('#leisure_traveller_4').val()+','
                                        +$('#leisure_traveller_5').val()+','
                                        +$('#leisure_traveller_6').val());
            //alert($('#travellers_concat').val());
        });
        
        $(function()
        {
            /**
             * Travel Insurance can only be for 12 months at the most
             * Therefore, we setup a max date of 365 days initially, then as the from date changes, we
             * dynamically change the date range to be 365 days out from the from date. This means the
             * validation should never fire as an invalid date can't be chosen.
             */
            ET.INSURANCE.$form.find('#in_leisureFrom').datepicker($.extend(ET.SETTINGS.datePicker, { minDate: 0, maxDate: null }));
            ET.INSURANCE.$form.find('#in_leisureTo').datepicker($.extend(ET.SETTINGS.datePicker, { minDate: 0, maxDate: 365 }));
            ET.INSURANCE.$form.find('#in_leisureFrom').bind('change', function(e) 
            {
                var toOffsetFromDate = FCL.DATETIME.compareDates(new Date(), FCL.DATETIME.stringToDate(ET.INSURANCE.$form.find('#in_leisureFrom').val()));
                ET.INSURANCE.$form.find('#in_leisureTo').datepicker('option', 'minDate', toOffsetFromDate.days);
                ET.INSURANCE.$form.find('#in_leisureTo').datepicker('option', 'maxDate', toOffsetFromDate.days + 365);
            });
        });
        
        // Question lightboxes        
        //$("a[rel^='prettyPhoto']").prettyPhoto();
        $('#travelInsuranceForm fieldset a').bind('click', function(e)
        { 
            e.preventDefault();
            $(this).attr('href', $(this).attr('href').split('?')[0]);
            $(this).attr('href', $(this).attr('href') + '?iframe=true&width=500');
            $.prettyPhoto.open($(this).attr('href'), '', 'Travel Insurance Information');
            $(this).attr('href', $(this).attr('href'));
        });
        
        // IE6 only supports hover on a elements so it needs a helping hand
        this.$form.find('#singleMultiTripContainer li label').bind('mouseover', function() { $(this).css('color', '#DF1949'); });
        this.$form.find('#singleMultiTripContainer li label').bind('mouseout', function() { $(this).css('color', '#000000'); });
        
        // Travel Insurance document chooser - on Travel Insurance home page
        /*
        $(document).ready(function()
        {
            $('#formChooser').bind('submit', function(e) 
            { 
                e.preventDefault();
                FCL.UTIL.popup($(this).find('select').val(), 'pdf', 640, 480);
            });
        });
        */     
    },   
    
    changeCountryByTravellersLiveAustralia: function()
    {
        // Flush Country
        /**** 2011-12-05 bannert: Disabling selection of inbound trips until CoverMore bug fix has been rolled out. ****/
        //this.$form.find('#in_leisureCountry option:gt(0)').remove();
        
        if(this.$form.find('#in_liveinCountry').val() == 'false')
        {
        /**** 2011-12-05 bannert: Disabling selection of inbound trips until CoverMore bug fix has been rolled out. ****/
        alert('Sorry! We can only insure travellers who are living in Australia.');
        /*
            // Flush region and country select codes
            this.$form.find('#in_leisureRegion option:gt(0)').remove();
            
            // Manually set values if travellers don't live in Australia and disable
            this.$form.find('#in_leisureRegion').append('<option value="6" selected="selected">Inbound to Australia</option>');
            this.$form.find('#in_leisureCountry').append('<option value="Australia" selected="selected">Australia</option>');
            this.$form.find('#in_leisureRegion, #in_leisureCountry').attr('disabled', 'disabled');
        */
        }
        
        if(ET.INSURANCE.$form.find('#in_liveinCountry').val() == 'true')
        {
            /**** 2011-12-05 bannert: Disabling selection of inbound trips until CoverMore bug fix has been rolled out. ****/
            /*
            ET.INSURANCE.$form.find('#in_leisureRegion, #in_leisureCountry').attr('disabled', '');
            this.singleMultiSwitch();
            */
        }
    },
    
    singleMultiSwitch: function() 
    {
        var policyOption = this.$form.find('#singleMultiTripContainer input:checked').val();
        
        this.$form.find('#in_policyOption').val(policyOption);
        
        // If live in country is No, don't change region and country options
        if(this.$form.find('#in_liveinCountry').val() == 'false') { return; }
        
        var tripTypeRegion = '';
        
        // Flush region options
        //this.$form.find('#in_leisureRegion option:gt(0)').remove();
        
            
        if(policyOption == 'SingleTrip')
        {
            tripTypeRegion = 'singleTripRegions';
            this.$form.find('#in_countryTimeInContainer, #in_toFieldContainer').css('visibility', 'visible');
        }

        if(policyOption == 'AnnualMultiTrip')
        {
            tripTypeRegion = 'multiTripRegions';
            this.$form.find('#in_countryTimeInContainer, #in_toFieldContainer').css('visibility', 'hidden');
        }

        /**** 2011-12-05 bannert: Disabling, as single- and multi- trip now use the same region options ****/
        /*
        this.populateRegions();
        */
        
    },
    
    populateRegions: function()
    {
        var tripTypeRegion = 'singleTripRegions';

        for(var i=0; i<this[tripTypeRegion].length; i++)
        {
            this.$form.find('#in_leisureRegion').append(FCL.UTIL.format('<option value="{1}">{2}</option>', this[tripTypeRegion][i].display, this[tripTypeRegion][i].display)); 
        }
        this.$form.find('#in_leisureRegion option:first').attr('selected', 'selected');
    },

    changeCountryRegionChange: function()
    {
        if(this.$form.find('input[name="policyoption"]:checked').val() == '2') { return; }
        
        var regionIndex = parseInt(this.$form.find('#in_leisureRegion')[0].selectedIndex, 0) - 1;
        this.$form.find('#in_leisureCountry option:gt(0)').remove();
        for(var i=0; i<this.areaTravel[regionIndex].length; i++)
        {
            this.$form.find('#in_leisureCountry').append(FCL.UTIL.format('<option value="{1}">{1}</option>', this.areaTravel[regionIndex][i], this.areaTravel[regionIndex][i]));             
        };
    },

    concatenateAges: function()
    {
            $('#travellers_concat').val($('.age_field').map(function(){
                return $(this).val();
            }.get().join(',')));
    },

    setupValidation: function()
    {
        // One traveller age must be entered
        $.validator.addMethod('in_requiredTraveller', function(value, element, params) 
        {
            var numTravellers = 0;
            $('#in_adultInputs input, #in_childrenInputs input').each(function()
            {
                if($(this).val() !== '' && $(this).val().match(/\d+/g)[0].length > 0)
                {
                    numTravellers++;
                }
            });
            
            return (numTravellers > 0);
        }, $.format('Please enter the Age of Each Traveller'));
        
        
        // Check departure date is before arrival date
        $.validator.addMethod('in_TravelDatesRequired', function(value, element, params) 
        {
            // If Annual Multi-trip, to date does not require validation
            if(ET.INSURANCE.$form.find('#in_singleTrip:checked').length == 0 && $(element).attr('id') == 'in_leisureTo') 
            { 
                return true;  
            }
            
            return (ET.INSURANCE.$form.find('#' + $(element).attr('id')).val() != '')
        }, $.format('This field is required'));
        
        
        // Check departure date is before arrival date
        $.validator.addMethod('in_TravelDatesValid', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(ET.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
            return FCL.DATETIME.stringToDate(ET.INSURANCE.$form.find('#in_leisureFrom').val()) < FCL.DATETIME.stringToDate(ET.INSURANCE.$form.find('#in_leisureTo').val());
        }, $.format('To date must be after From date'));
        
        
        // Travel insurance can only cover travellers for a maximum of 1 year
        $.validator.addMethod('in_TravelDatesDuration', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(ET.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
            var dateResult = FCL.DATETIME.compareDatesDDMMYYYY(ET.INSURANCE.$form.find('#in_leisureFrom').val(), ET.INSURANCE.$form.find('#in_leisureTo').val());      
            return (dateResult.days <= 365);
        }, $.format('We can only insure trips up to one year duration. Please check the dates you have entered.'));
        
        
        // Country is only required if single trip
        $.validator.addMethod('in_CountryRequired', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(ET.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
            return (ET.INSURANCE.$form.find('#in_leisureCountry').val() != '');             
        }, $.format('This field is required'));
        
        
        // Insurance is only available to people 84 and under (Only affects Annual Single Trip)
        $.validator.addMethod('in_adultAges', function(value, element, params) 
        {
            if(ET.INSURANCE.$form.find('input[name="policyoption"]:checked').val() == '2') { return true; }
            
            if($(element).val() == '') { return true; }
            else {
                return parseInt($(element).val(), 10) <= 84;
            }
        }, $.format('Sorry, we cannot offer insurance to travellers over the age of 84'));
        
        
        // Annual Multi-Trip insurance is only available to people 74 and under
        $.validator.addMethod('in_MultiTripAge', function(value, element, params) 
        {
            if(ET.INSURANCE.$form.find('input[name="policyoption"]:checked').val() == '1') { return true; }
            
            if($(element).val() == '') { return true; }
            return parseInt($(element).val(), 10) <= 74;
        }, $.format('Sorry,  Family Annual Multi Trip is currently unavailable for travellers over 74.'));
        
        
        // Age of children must be less than 21
        /*
        $.validator.addMethod('in_childAges', function(value, element, params) 
        {
            if($(element).val() == '') { return true; }
            return parseInt($(element).val(), 10) <= 20;
        }, $.format('Age of children must be less than 21.'));
        */
        
        // Once validation passes, set destination to match in intDestinations object
        this.$form.validate(
        {
            rules: 
            {
                Area: 'required',
                StartDate: 'in_TravelDatesRequired',
                EndDate: 
                {
                    in_TravelDatesRequired: true,
                    in_TravelDatesValid: true,
                    in_TravelDatesDuration: true                    
                },
                age1: 
                {
                    digits: true,
                    in_requiredTraveller: true
                    //in_adultAges: true,
                    //in_MultiTripAge: true
                },
                age2: 
                {
                    digits: true
                },
                age3: 
                {
                    digits: true
                },
                age4: 
                {
                    digits: true
                },
                age5: 
                {
                    digits: true
                },
                age6: 
                {
                    digits: true
                }
            },
 
            invalidHandler: function(e, validator) 
            {
               FCL.FORMS.invalidForm(e, validator, ET.INSURANCE.fieldMappings);
            },
 
            submitHandler: function(form)
            {           
                if(ET.INSURANCE.$form.find('#in_singleTrip').is(':checked') && ET.INSURANCE.$form.find('#in_leisureCountry').val() == '') {
                    alert('1 field has errors: \n - Country Most Time Spent In: This field is required.');
                    return false;
                }
                form.submit();
            } 
        }); 
    },

    /*
     *  Sets up the popups
     */
    setupPopups: function()
    {
        var _this = this;
        $('.question').each(function(i,ele){
            
            $(this).click(function(e){
                e.preventDefault();
                _this._popup( $(this).attr('href') );

            });
        });
    },

    /*
     *  This function pops up the external link in a window.
     * @params string
     */
    _popup: function(url)
    {
        sealWin=window.open(url,"win",'toolbar=0, target=blank, location=0,directories=0,status=0,menubar=no,scrollbars=yes,resizable=no,width=500,height=450');
        window.name="winmain";
    }
};
ET.INSURANCE.init();
