SF.FAREINFO = {
    
    FIELDNAMES : {
        departureDate: 'Departure date',
        GNEreturnDate: 'Return date',
        departure: 'Departing from',
        destinationdisplay: 'Travelling to'
    },
    
    intDestinations:
    {
        AKL: ['auckland'],
        ATH: ['athens'],
    
        BCN: ['barcelona'],
        BER: ['berlin'],
        BRN: ['bern', 'switzerland'],
        
        CAI: ['cairo'],
        CNS: ['port douglas'],
        CPT: ['capetown'],
        
        DKR: ['senegal'],
        DPS: ['bali', 'denpassar', 'dempasar', 'dempesar', 'dempaser', 'dempassar', 'dempasser', 'denpasar', 'denpaser', 'denpassar', 'denpasser'],
        DUB: ['dublin'],
        
        FLR: ['florence'],
        FUN: ['tuvalu'],
        
        HKG: ['hk'],
        HNL: ['hawaii'],
		HKT: ['phuket'],
        
        KTM: ['katmandu'],
        KUL: ['kl', 'malaysia'],
        
        LAS: ['las vegas'],
        LAX: ['los angeles'],
        LED: ['st. petersburg', 'st petersburg'],
        LON: ['london', 'united kingdom', 'heathrow', 'gatwick', 'stansted', 'gatwick', 'uk', 'lhr', 'england'],
        
        MAN: ['manchester'],
        MNL: ['manila', 'manilla'],
        
        NYC: ['united states', 'new york city'],
        
        PAR: ['paris'],
        PNH: ['phenom phen'],
            
        ROM: ['rome', 'venice'],
        
        SGN: ['saigon'],
        STO: ['stockholm'],
        
        TPE: ['taiwan'],
        
        WAS: ['washington', 'washington dc', 'washington d.c.'],
        YTO: ['toronto']
    },
    
    
    init: function(){        
            this.$form = $('#gneForm');
            this.setupForm();  
            this.setupValidation(); 

    },
    
    setupForm: function() {

        var $departureObj = $('#departureInt');
        var $destinationDispalyObj = $('#destinationDisplay');
        var strUrlDeparture = '';
        var strUrlDestination = '';
        
        strUrlDeparture = SF.getQueryVariable('departure');
        strUrlDestination = SF.getQueryVariable('destination');

        if ($departureObj.length > 0 || $destinationDispalyObj.length >0) 
        {
            if (strUrlDeparture != '') 
            {
                $departureObj.find('option[value="'+strUrlDeparture+'"]').attr('selected', true)
            };
            
            if (strUrlDestination != '') 
            {
                $destinationDispalyObj.val(strUrlDestination);    
            };
            
        };



        var $tripType = this.$form.find('#tripType');
        
        this.$form.find('#intDepartDateHidden').val(SF.DATETIME.futureDateDays(1));
        this.$form.find('#intReturnDateHidden').val(SF.DATETIME.futureDateDays(7));
        this.$form.find('#airportCode').val('');

        var _this = this;
        
        $(document).ready(function(){

            _this.$form.find('#gneDepartureDateInt').datepicker({
                minDate: 1,
                dateFormat: 'dd/mm/yy',
                altField: '#intDepartDateHidden',
                altFormat: 'dd/mm/yy'
            });

            _this.$form.find('#gneReturnDateInt').datepicker({
                minDate: 3,
                dateFormat: 'dd/mm/yy',
                altField: '#intReturnDateHidden',
                altFormat: 'dd/mm/yy',
                beforeShow: function(){
                    var depDateVal = _this.$form.find('#intDepartDateHidden').val();
                    var newDateVal = SF.DATETIME.stringToDate(depDateVal);
                    return {minDate:newDateVal}
                }
            });
        });

        // Adding values to hidden fields
        this.$form.find('#todaysDate').val(SF.DATETIME.todaysDate());

        this.$form.find('#return').bind('click', function(){
            $tripType.val('RT')
            SF.FAREINFO.$form.find('#gneReturnDateInt').attr('disabled', '');
        });
        
        this.$form.find('#oneWay').bind('click', function(){
            $tripType.val('OW');    
            SF.FAREINFO.$form.find('#gneReturnDateInt').attr('disabled', 'disabled');
        });
        
        this.$form.find('#gneDepartureDateInt').val(SF.DATETIME.futureDateDays(1));
        this.$form.find('#gneReturnDateInt').val(SF.DATETIME.futureDateDays(7));
            
    },
    parseDestination: function() 
    {
        this.airportFound = false;
        var destination = $.trim(this.$form.find('#destinationDisplay').val()).toLowerCase();
        
        $.each(this.intDestinations, function(key) 
        {
            // If they've typed in an airport code, brilliant! Exit
            
            if(destination == key) 
            {
                SF.FAREINFO.$form.find('#airportCode').val(key);
                SF.FAREINFO.airportFound = true;
                return false;
            }
            
            // Otherwise, try and match agianst city or country
            var airportCode = key;
            $.each(SF.FAREINFO.intDestinations[key], function(key, val) 
            {	
                if(destination.indexOf(val.toLowerCase()) > -1) 
                {
                    SF.FAREINFO.$form.find('#airportCode').val(airportCode);
                    SF.FAREINFO.airportFound = true;
                    return false;
                }
            });
            if(SF.FAREINFO.airportFound) 
            {
                return false;
            }
        });
        
        // If we haven't found a match empty, use destination
        if(this.airportFound == false) 
        {
            this.$form.find('#airportCode').val(destination);   
        }
    },     


    setupValidation: function() 
    {

       var _this = this;

      $.validator.addMethod('departureArrivalDates', function(value, element)
      {
           var $parent = $(element).parent().parent();
           return $('#oneWay').is(':checked') || FCL.DATETIME.stringToDate($parent.find('#gneDepartureDateInt').val()) < FCL.DATETIME.stringToDate($parent.find('#gneReturnDateInt').val());
       }, $.format('Return date must be after departure date'));

       $.validator.addMethod('departureDateisValid', function(value, element)
       {
           var $parent = $(element).parent().parent();
           return FCL.DATETIME.stringToDate($parent.find('#gneDepartureDateInt').val()) > FCL.DATETIME.stringToDate(FCL.DATETIME.futureDateDays(3));

       }, $.format('Departure date must be at least three days from now.'));

         this.$form.validate({
            highlight: function(element, errorClass) 
            {
                $(element).css('background-color', 'LemonChiffon')
             },
              
            invalidHandler: function(form, validator) 
            {
                var strError ='';
                var errorMessage = '';
                var intErrors = validator.numberOfInvalids();   
                
                for (var formError in validator.errorMap) 
                {
                    strError += SF.FAREINFO.FIELDNAMES[formError] + ': ' + validator.errorMap[formError] + '\n'                               
                }
                if (strError != '') 
                {
                    alert(strError);
                };
                        
            },
          
            rules: {
                
                departure:
                {
                    required: true
                },
                departureDate: 
                {
                    departureDateisValid: true,
                    departureArrivalDates:true,
                    required: true
                },
                GNEreturnDate: 
                {
                    required: 
                    {
                        depends: function() 
                        {
                            return $('#return').is(':checked');
                        }
                    }   
                },
                destinationdisplay: 
                {
                    required: true
                }
            },
            submitHandler: function(form) 
            {

                $('#scbLoader').show();
                SF.FAREINFO.parseDestination();
				SF.FAREINFOTEMP.init();
                form.submit();
            }
             
    });
    }   

}

SF.FAREINFO.init();
