/**
 * Insurance Search form
 *
 * @author          Kate Bascombe
 * @modifiedby      $LastChangedBy: blundenr $
 * @copyright       Copyright Flight Centre Ltd. All rights reserved.
 * @version         $Revision: 6 $
 * @lastmodified    $Date: 2011-01-23 21:15:17 +1000 (Sun, 23 Jan 2011) $
 * @requires        FCL, FCL.UTIL, FCL.FORMS, TT.SEARCH
 */

;TT.INSURANCE = $.extend(true, {}, TT.SEARCH,
{
    minYear: 1900,
    
    maxYear: 2100,
    
    $form: null,
    
    multiTripRegions: 
    [
        { display: 'Worldwide', value: 1  },
        { display: 'Restricted Worldwide', value: 2 },
        { display: 'Australia', value: 5 }
    ],
    
    singleTripRegions: 
    [
        { display: 'The Americas/Africa', value: 1 }, 
        { display: 'Europe, Asia & Middle East', value: 2 },  
        { display: 'UK and Southeast Asia', value: 3 },  
        { display: 'Indonesia/Southwest Pacific & NZ', value: 4 }, 
        { display: 'Australia', value: 5 },  
        { display: 'Inbound to Australia', value: 6 }
    ],
    
    areaTravel:
    [
        ['Algeria','Angola','Antarctica (Cruising)','Antigua and Barbuda','Argentina','Bahamas','Barbados','Belize','Benin','Bermuda','Bolivia','Botswana','Brazil','Burkina Faso','Burundi','Cameroon','Canada','Cape Verde','Cayman Islands','Central African Republic','Chad','Chile','Colombia','Comoros','Congo (Dem. Rep.)','Costa Rica','Cuba','Djibouti','Dominica','Dominican Rep.','Ecuador','Egypt','El Salvador','Equatorial Guinea','Eritrea','Ethiopia','Falkland Islands','French Guiana','Gabon','Gambia','Ghana','Greenland','Grenada','Guadeloupe','Guatemala','Guinea','Guinea-Bissau','Guyana','Haiti','Hawaii (USA)','Honduras','Ivory Coast','Jamaica','Kenya','Lesotho','Liberia','Libya','Madagascar','Malawi','Mali','Martinique','Mauritania','Mauritius','Mexico','Morocco','Mozambique','Namibia','Nicaragua','Niger','Nigeria','Panama','Paraguay','Peru','Puerto Rico','Reunion','Rwanda','Sao Tome and Principe','Senegal','Seychelles','Sierra Leone','Somalia','South Africa','St. Kitts &amp; Nevis','St. Lucia','St. Vincent &amp; Grenadines','Sudan','Suriname','Swaziland','Tanzania','Togo','Trinidad &amp; Tobago','Tunisia','Uganda','United States of America','Uruguay','Venezuela','Virgin Islands','Western Sahara (Morocco)','Zambia','Zimbabwe'],
        ['Afghanistan','Albania','Andorra','Armenia','Austria','Azerbaijan','Azores','Bahrain','Bangladesh','Belarus','Belgium','Bhutan','Bosnia','Bulgaria','Canary Islands','China','Croatia','Cyprus','Czech Republic','Denmark','Dubai (UAE)','Estonia','Europe','Faroe Islands','Finland','France','Georgia','Germany','Gibraltar','Greece','Herzegovina','Hong Kong','Hungary','Iceland','India','Iran','Iraq','Ireland','Israel','Italy','Japan','Jordan','Kazakhstan','Korea (north)','Korea (south)','Kuwait','Kyrgyzstan','Latvia','Lebanon','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Madeira','Maldives','Malta','Moldova','Monaco','Mongolia','Montenegro','Nepal','Netherlands Antilles','Netherlands','North Korea','Norway','Oman','Pakistan','Poland','Portugal','Qatar','Romania','Russia','San Marino','Saudi Arabia','Serbia','Sharjah (United Arab Emirates)','Slovakia','Slovenia','South Korea','Spain','Sri Lanka','Sweden','Switzerland','Syria','Taiwan','Tajikistan','Turkey','Turkmenistan','Ukraine','United Arab Emirates','Uzbekistan','Vatican City','Yemen'],
        ['Brunei','Burma (Myanmar)','Cambodia','England (United Kingdom)','Federated States of Micronesia','Guam','Guernsey','Isle of Man','Jersey','Laos','Malaysia','Marshall Islands','Micronesia','Myanmar (Burma)','Northern Ireland','Northern Marianas','Palau','Philippines','Republic of Ireland','Sabah (Malaysia)','Sarawak (Malaysia)','Scotland (UK)','Singapore','Thailand','United Kingdom','Vietnam','Wales (UK)'],
        ['American Samoa','Bali (Indonesia)','Cook Islands','Domestic Cruise','East Timor','Fiji','French Polynesia','Indonesia','Kiribati','Lombok (Indonesia)','Nauru','New Caledonia','New Zealand','Norfolk Island','Papua New Guinea','Samoa','Solomon Islands','South West Pacific','Tahiti','Tonga','Tuvalu','Vanuatu','Western Samoa'],
        ['Antarctica-Sightseeing Flight','Australia','Christmas Island','Lord Howe Island','Willis Island'],
        ['Australia']
    ],
 
    init: function()
    {
        TT.INSURANCE.$form = $('#travelInsuranceForm');
        TT.INSURANCE.setupInsuranceForm();
        TT.INSURANCE.setupValidation();
    },
 
    setupInsuranceForm: function()
    {
        // Setup session on Travel Insurance site
        this.$form.after('<iframe frameborder="no" height="0" width="0" src="https://b2c.covermore.com.au/index.jsp?alpha=FLQ1920" class="hide"></iframe>');
        
        // Reset all form elements to default values
        this.$form.find('#singleMultiTripContainer input:first').attr('checked', 'checked');
        this.$form.find('select option:first').attr('selected', 'selected');
		this.$form.find('#in_liveinCountry').val('Yes');
		this.$form.find('#in_leisureFrom, #in_leisureTo').fclDefaultInput('dd/mm/yyyy');
		
		// Add datepickers
		this.departReturnDatePickers('in_leisureFrom', 'in_leisureTo');
        
        // Fire this manually at setup time to get select elements populated with default values (Single Trip)
        this.singleMultiSwitch();
        
        // We need to target the li as it's the only thing that worked reliably on IE6
        this.$form.find('#singleMultiTripContainer li').bind('click', function(e) 
        {
            TT.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) { TT.INSURANCE.changeCountryByTravellersLiveAustralia(); });
        
        this.$form.find('#in_leisureRegion').bind('change', function(e) { TT.INSURANCE.changeCountryRegionChange(); });
        
        // Question lightboxes
        $('#travelInsuranceForm fieldset a').bind('click', function(e)
        { 
            e.preventDefault();
            $(this).attr('href', $(this).attr('href') + '?iframe=true&width=500');
            $.prettyPhoto.open($(this).attr('href'), '', 'Travel Insurance Information');
        });
		
		this.setup();
    },   
    
    changeCountryByTravellersLiveAustralia: function()
    {
        // Flush Country
        this.$form.find('#in_leisureCountry option:gt(0)').remove();
        
        if(this.$form.find('#in_liveinCountry').val() == 'No')
        {
            // 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', true);
        }
        
        if(TT.INSURANCE.$form.find('#in_liveinCountry').val() == 'Yes')
        {
            TT.INSURANCE.$form.find('#in_leisureRegion, #in_leisureCountry').attr('disabled', false);
            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() == 'No') {return;};
        
        var tripTypeRegion = '';
        
        // Flush region options
        this.$form.find('#in_leisureRegion option:gt(0)').remove();
        
        if(policyOption == '1')
        {
            tripTypeRegion = 'singleTripRegions'; 
            this.$form.find('#in_leisureCountry, #in_leisureTo').attr('disabled', false);
        }

        if(policyOption == '2')
        {
            tripTypeRegion = 'multiTripRegions';
			this.$form.find('#in_leisureCountry').val('').attr('selected', true);
			this.$form.find('#in_leisureTo').val('dd/mm/yyyy');
            this.$form.find('#in_leisureCountry, #in_leisureTo').attr('disabled', true);
        }

        for(var i=0; i<this[tripTypeRegion].length; i++)
        {
            this.$form.find('#in_leisureRegion').append('<option value="{1}">{2}</option>'.fclFormat(this[tripTypeRegion][i].value, 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').attr('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('<option value="{1}">{1}</option>'.fclFormat(this.areaTravel[regionIndex][i], this.areaTravel[regionIndex][i]));     		
        };
    },
	
    fieldMappings: 
    {
        leisure_region: 'Area of Travel',
        leisure_country: 'Most time in',
        leisure_from: 'From',
        leisure_to: 'To',
        leisure_traveller_1: 'Adult Ages',
        leisure_traveller_2: 'Adult Ages',
		leisure_traveller_3: 'Child Ages',
		leisure_traveller_4: 'Child Ages',
		leisure_traveller_5: 'Child Ages',
		leisure_traveller_6: 'Child Ages',
		leisure_traveller_7: 'Child Ages',
		leisure_traveller_8: 'Child Ages'
    },

	setupValidation: function()
    {
        // One traveller age must be entered
        jQuery.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);
        }, jQuery.format('Please enter the age of each traveller'));
        
        // Travel insurance can only cover travellers for a maximum of 1 year
        jQuery.validator.addMethod('in_TravelDatesDuration', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(TT.INSURANCE.$form.find('#in_singleTrip:checked').length == 0 || TT.INSURANCE.$form.find('#in_leisureFrom').val() === 'dd/mm/yyyy' || TT.INSURANCE.$form.find('#in_leisureTo').val() === 'dd/mm/yyyy') { return true; }
            
            var dateResult = FCL.DATETIME.compareDatesDDMMYYYY(TT.INSURANCE.$form.find('#in_leisureFrom').val(), TT.INSURANCE.$form.find('#in_leisureTo').val());      
            return (dateResult.days <= 365);
        }, jQuery.format('We can only insure trips up to one year duration. Please check the dates you have entered.'));
        
		// From Date required
        jQuery.validator.addMethod('in_TravelDatesFromRequired', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(TT.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
			return !(TT.INSURANCE.$form.find('#in_leisureFrom').val() === 'dd/mm/yyyy');      

        }, jQuery.format('Please enter a date.'));
		
		
		// To Date required
        jQuery.validator.addMethod('in_TravelDatesToRequired', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(TT.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
			return !(TT.INSURANCE.$form.find('#in_leisureTo').val() === 'dd/mm/yyyy');      

        }, jQuery.format('Please enter a date.'));
		
		
        // Country is only required if single trip
        jQuery.validator.addMethod('in_CountryRequired', function(value, element, params) 
        {
            // If Annual Multi-trip, dates do not require validation
            if(TT.INSURANCE.$form.find('#in_singleTrip:checked').length == 0) { return true; }
            
            return (TT.INSURANCE.$form.find('#in_leisureCountry').val() != '');             
        }, jQuery.format('This field is required'));
        
        
        // Insurance is only available to people 84 and under (Only affects Annual Single Trip)
        jQuery.validator.addMethod('in_adultAges', function(value, element, params) 
        {
            if(TT.INSURANCE.$form.find('input[name="policyoption"]').val() == '2') { return true; }
            
            if($(element).val() == '') { return true; }
            return parseInt($(element).val(), 10) <= 84;
        }, jQuery.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
        jQuery.validator.addMethod('in_MultiTripAge', function(value, element, params) 
        {
            if(TT.INSURANCE.$form.find('input[name="policyoption"]').val() == '1') { return true; }
            
            if($(element).val() == '') { return true; }
            return parseInt($(element).val(), 10) <= 74;
        }, jQuery.format('Sorry,  Family Annual Multi Trip is currently unavailable for travellers over 74.'));
        
        
        // Age of children must be less than 21
        jQuery.validator.addMethod('in_childAges', function(value, element, params) 
        {
            if($(element).val() == '') { return true; }
            return parseInt($(element).val(), 10) <= 20;
        }, jQuery.format('Age of children must be less than 21.'));
         
        
        // Once validation passes, set destination to match in intDestinations object
        this.$form.validate(
        {

			rules: 
            {
                livein_country: 'required',
                leisure_region: 'required',
                leisure_country: 'in_CountryRequired',
				leisure_from: 'in_TravelDatesFromRequired',
                leisure_to: 
                {
                    in_TravelDatesDuration: true,
					in_TravelDatesToRequired: true					
                },
                leisure_traveller_1: 
                {
                    digits: true,
                    in_requiredTraveller: true,
                    in_adultAges: true,
                    in_MultiTripAge: true
                },
                leisure_traveller_2:
                {
                    digits: true,
                    in_adultAges: true
                },
                leisure_traveller_3:
                {
                    digits: true,
                    in_childAges: true
                },
                leisure_traveller_4:
                {
                    digits: true,
                    in_childAges: true
                },
                leisure_traveller_5:
                {
                    digits: true,
                    in_childAges: true
                },
                leisure_traveller_6:
                {
                    digits: true,
                    in_childAges: true
                },
                leisure_traveller_7:
                {
                    digits: true,
                    in_childAges: true
                },
				leisure_traveller_8:
                {
                    digits: true,
                    in_childAges: true
                }
            },
 
            invalidHandler: function(e, validator) 
            {
               FCL.FORMS.invalidForm(e, validator, TT.INSURANCE.fieldMappings, 'dialog', FCL.UTIL.titleCaps(TT.INSURANCE.name.split('.')[1].toLowerCase()) + ' Validation Errors');
			},
 
            submitHandler: function(form)
            {
				$('.submitButton').hide();
				$('.replacedSubmitButton').show();
                form.submit();
            } 
        }); 
	}
});
