var NISSAN = {
// Various configuration variables
    config: {
        headerFooter: {
            shell:  'http://www.nissan.co.uk/flash/devenv/deploy/shell/swf/shell.swf',
            conf:   'http://www.nissan.co.uk/GB/en.-shellconf.conf',
            header: 'http://www.nissan.co.uk/GB/en.-headerContent-Single-nointernal-trvheaderxml.xml',
            footer: 'http://www.nissan.co.uk/GB/en.-footerContent-Single-nointernal-trvfooterxml.xml'
        },
        pushes: {
            swf: '/static10/swf/push.swf',
            minScreenWidth: 1100, // 700 (.wrapper) + 2*200 (.pushpanel)
            panels: []
        },
        filter: {
            offers: []
        }
    },

// Often used variables so we don't have to re-create the jQuery objects
    window: $(window),
    wrapper: $('.wrapper'),
    header_container: $('#header_container'),
    footer_container: $('#footer_container'),

    init: function() {
        this.filterInit();
        this.navInit();
        this.linkInit();

// Make sure these two are last
        this.headerFooterInit();
        this.pushesInit();
    },

    navInit: function() {
        $('.dropdown').hover(
            function() {
                $('ul', this).fadeIn('fast');
            },
            function() {
                $('ul', this).fadeOut('fast');
            }
        );
    },

// Link handling for the Features and Accessories
    linkInit: function() {
        var $obj = $('.feature, .accessory');
        var $links = $('.feature-link, .accessory-link');
        $links.click(function() {
            var $link = $(this);
            $obj.hide();
            $($link.attr('href')).show();
            return false;
        });
        // handling hiding Accessories
        $('.accessories-close a').click(function() {
            $($(this).attr('href')).hide();
            return false;
        });
    },

// Offer filters
    filterInit: function() {
        var $priceSlider = $('#price-slider');
        var offers = NISSAN.config.filter.offers;

        if ($priceSlider.length) {
// Calculate the min/max offer price for the price slider
            var absMinPrice = 99999;
            var absMaxPrice = 0;
            for (var i = 0; i < offers.length; i++) {
                var offer = offers[i];

                if (offer.price > 1) {
                    if (offer.price < absMinPrice) {
                        absMinPrice = offer.price;
                    }
                    if (offer.price > absMaxPrice) {
                        absMaxPrice = offer.price;
                    }
                }
            }

// Set up price range slider
            var sliderMin = Math.floor(absMinPrice / 1000) * 1000;
            var sliderMax = Math.round(absMaxPrice / 1000 + 0.5) * 1000;

            $priceSlider.slider({
                range: true,
                min: sliderMin,
                max: sliderMax,
                step: 500,
                values: [sliderMin, sliderMax],
                slide: function(event, ui) {
                    var $handle = $(ui.handle);
                    $($handle.hasClass('rangeslider-handle-left') ? '.price-slider-min span' : '.price-slider-max span').text(NISSAN.formatCurrency(ui.value));
                },
                change: function(event, ui) {
                    NISSAN.filterOffers();
                }
            });
            $('.ui-slider').each(function() {
                $('.ui-slider-handle:first', this).addClass('rangeslider-handle-left');
                $('.ui-slider-handle:last', this).addClass('rangeslider-handle-right');
            });
            $('.price-slider-min span').text(NISSAN.formatCurrency(sliderMin));
            $('.price-slider-max span').text(NISSAN.formatCurrency(sliderMax));
        }

// Set up the range filter checkboxes
        $('input[name=range], input[name=range-all]').click(function() {
            NISSAN.filterCheckAll('range', this);
            NISSAN.filterOffers();
        });

// Set up the finance type filter checkboxes
        $('input[name=finance-type], input[name=finance-type-all]').click(function() {
            NISSAN.filterCheckAll('finance-type', this);
            NISSAN.filterOffers();
        });

// Set up the model filter checkboxes
        $('.range-filter ul input:checkbox').click(function() {
            NISSAN.filterCheckAllModel(this);
            NISSAN.filterOffers();
        });

// Preselect a Range
        if (window.location.search.match(/[?&;]range=([^&;]+)/)) {
            var range = RegExp.$1.toLowerCase();
            $('#range-' + range).attr('checked', true).triggerHandler('click');
        }

// Preselect an Offer type
        if (window.location.search.match(/[?&;]offer=(\d+)/)) {
            var offer = RegExp.$1;
            $('#finance-type-' + offer).attr('checked', true).triggerHandler('click');
        }

// Make sure selections are valid (only really needed for Firefox as other
// browsers reset back to All)
        $.each(['finance-type', 'range'], function(index, name) {
            var $all = $('input[name=' + name + '-all]');
            var $inputs = $('input[name=' + name + ']');

            if ($inputs.length == $inputs.not('input:checked').length) {
                $all.attr('checked', true).triggerHandler('click');
            }
            else {
                $all.attr('checked', false);
                $inputs.not('input:checked').each(function() {
                    $(this).triggerHandler('click');
                });
                $inputs.filter('input:checked').each(function() {
                    var $child = $(this).parent().find('ul');
                    if ($child.length) {
                        if ($child.find('input:checked').length) {
// Don't trigger the handler as we want to show the existing selection
                            $child.show();
                        }
                        else {
                            $(this).attr('checked', false).triggerHandler('click');
                        }
                    }
                });
            }
        });

// Set up For Who tabs
        $('.for-who-you a, .for-who-business a').click(function() {
            var $link = $(this);
            var forBusiness = $link.attr('href') == '#for-business' ? true : false;

            var selectedClass = 'for-who-' + (forBusiness ? 'business' : 'you');
            var deSelectedClass = 'for-who-' + (forBusiness ? 'you' : 'business');

            $('.' + deSelectedClass).removeClass(deSelectedClass + '-selected');
            $('.' + selectedClass).addClass(selectedClass + '-selected');

            NISSAN.filterOffers();

            return false;
        });

// Preselect for Who
        if (window.location.search.match(/[?&;]business=/)) {
            $('.for-who-business a').click();
        }
        else {
            // Select the Business Offers tab if there are only Business Offers
            var $selected;
            var personalOffers = 0, businessOffers = 0;
            for (i = 0; i < offers.length; i++) {
                if (offers[i].business) {
                    businessOffers++;
                }
                else {
                    personalOffers++;
                }
            }

            if (personalOffers === 0 && businessOffers > 0) {
                $selected = $('.for-who-business a');
            }
            else {
                $selected = $('.for-who-you a');
            }
            $selected.click();
        }

// Set up the finance type dropdowns
        $('.offers-header').click(function() {
            var $offer = $(this);
            $offer.toggleClass('offers-header-selected').siblings().slideToggle();
            Cufon.refresh('h4');
        });

// Set up the hide offer buttons
        $('.offers-hide').click(function() {
            var $link = $(this);
            $($link.attr('href')).hide();

            return false;
        });

// Set up Clear Nissan/Trade In finance type selectors
        $('input[name=offers-finance-type]').click(function() {
            var $cb = $(this);
            $($cb.val()).slideToggle();
        });

// Pre-open offers dropdowns
        if (window.location.hash.match(/^(#offers-\d+)(-\d+)?(-business)?$/)) {
            var offerType = RegExp.$1;
            var financeType = RegExp.$2;
            var forBusiness = RegExp.$3;
            if (forBusiness.length) {
                $('.for-who-business a').click();
            }

            var $offerHeader = $(offerType + ' .offers-header');
            $('html, body').animate({
                scrollTop: $offerHeader.offset().top
            }, 1000);

            if (!$offerHeader.hasClass('offers-header-selected')) {
                $offerHeader.click();
            }
            if (financeType.length) {
                $(offerType + financeType).attr('checked', true);
            }
        }

// Pre-open finance types
        $('input[name=offers-finance-type]:checked').each(function() {
            $(this).triggerHandler('click');
        });

// If we only have a single offer type, pre-open it
// Not sure if client wants this
/*
        var $offerTypes = $('.offers:visible');
        if ($offerTypes.length == 1 && $offerTypes.find('.offers-header-selected').length == 0) {
            $offerTypes.find('.offers-header').click();
        }
*/
    },

// Model checkbox handling
    filterCheckAllModel: function(obj) {
        var $obj = $(obj);
        var name = $obj.attr('name');

// Unchecked a model checkbox, uncheck the range checkbox?
        if (!$obj.attr('checked')) {
            var $inputs = $('input[name=' + name + ']');
            if ($inputs.length == $inputs.not('input:checked').length) {
                var range = name.replace(/^model-/, 'range-');
                $('#' + range).attr('checked', false).triggerHandler('click');
            }
        }
    },

// Checkbox handling for everything else
    filterCheckAll: function(name, obj) {
        var $obj = $(obj);

        var $all = $('input[name=' + name + '-all]');
        var $inputs = $('input[name=' + name + ']');

// All checkbox
        if ($obj.get(0) == $all.get(0)) {
            if ($all.attr('checked')) {
// Uncheck everything, then trigger the click handlers (it's done this way as
// .click() doesn't uncheck the checkbox before triggering the handler).
                $inputs.attr('checked', false).each(function() {
                    $(this).triggerHandler('click');
                });
            }
            else {
                $all.attr('checked', true);
            }
        }
        else {
// Other checkboxes (uncheck All)
            if ($obj.attr('checked')) {
                $all.attr('checked', false);
            }
// Other checkboxes (check All if other checkboxes are unchecked)
            else if ($inputs.length == $inputs.not('input:checked').length) {
                $all.attr('checked', true);
            }

// For ranges, that have a sub-menu of items
            var $child = $obj.parent().find('ul');
            if ($child.length) {
                if ($obj.attr('checked')) {
                    $child.find('input:checkbox').attr('checked', true);
                    $child.show();
                }
                else {
                    $child.hide();
                    $child.find('input:checkbox').attr('checked', false);
                }
            }
        }
    },

    filterOffers: function() {
// Figure out what filters the user has selected
        var models = {};
        var $rangeAll = $('input[name=range-all]');
        var rangeAll = $rangeAll.length ? $rangeAll.attr('checked') : true;
        $('.range-filter ul input').each(function() {
            var $model = $(this);
            if ($model.attr('checked')) {
                models[$model.val()] = true;
            }
        });

        var financeTypes = {};
        var $financeAll = $('input[name=finance-type-all]');
        var financeAll = $financeAll.length ? $financeAll.attr('checked') : true;
        $('input[name=finance-type]').each(function () {
            var $type = $(this);
            if ($type.attr('checked')) {
                financeTypes[$type.val()] = true;
            }
        });

        var $priceSlider = $('#price-slider');
        var prices = [0, 999999];
        if ($priceSlider.length) {
          prices = $priceSlider.slider('option', 'values');
        }

        var forBusiness = $('.for-who-business.for-who-business-selected').length > 0;
        var offers = NISSAN.config.filter.offers;

// The number of offers there are for the opposite of the forBusiness selection
// (eg. if the user is viewing Business Offers, then it's the number of
// Personal Offers).  We keep track of this so that if the user gets no visible
// results for Personal Offers, we can switch them to view the Business Offers
// and vice versa.
        var ForBusinessCounts = 0;
        var NotForBusinessCounts = 0;

// Show/Hide the offers
        var offerCounts = {};
        var visibleModels = {};
        for (i = 0; i < offers.length; i++) {
            var offer = offers[i];
            if (!offerCounts[offer.type]) {
                offerCounts[offer.type] = 0;
            }
            if ((financeAll || financeTypes[offer.type]) &&
                (rangeAll || models[offer.model]) &&
                offer.price >= prices[0] && offer.price <= prices[1]) {
                if (offer.business == forBusiness) {
                    if (!visibleModels[offer.model]) {
                        visibleModels[offer.model] = 0;
                    }
                    visibleModels[offer.model]++;
                    $('#offer-' + offer.id).show();

                    ForBusinessCounts++;
                    offerCounts[offer.type]++;
                }
                else {
                    NotForBusinessCounts++;
                    $('#offer-' + offer.id).hide();
                }
            }
            else {
                $('#offer-' + offer.id).hide();
            }
        }

// A little hack to switch from Personal Offers to Business offers if the
// filters you have chosen do not result in any offers (but do for the
// opposite).
        if (ForBusinessCounts === 0 && NotForBusinessCounts > 0) {
            if (forBusiness) {
                $('.for-who-you a').click();
            }
            else {
                $('.for-who-business a').click();
            }
            return;
        }

// Show/Hide the offer type boxes
        $('.offers').each(function() {
            var $offer = $(this);
            if ($offer.attr('id').match(/offers-(\d+)/)) {
                var offerType = RegExp.$1;

                if (offerCounts[offerType] > 0) {
                    $offer.find('h4 span').text('(' + offerCounts[offerType] + ')');
                    $offer.show();
                }
                else {
                    $offer.hide();
                }
            }
        });
        Cufon.refresh('h4');

// Update offer modules
        $('.model-module').each(function() {
            var $module = $(this);
            if (!$module.attr('id').match(/^model-module-(\d+)/)) {
                return;
            }
            var model = RegExp.$1;
            if (visibleModels[model] > 0) {
                $module.find('.model-module-offers span').text(visibleModels[model]);
                $module.css('visibility', 'visible').show();
            }
            else {
                $module.hide();
            }
        });

// Hide/show the no offers found text
        if ($('.model-module:visible').length === 0) {
            $('#no-offers').show();
        }
        else {
            $('#no-offers').hide();
        }
    },

// Reset the filters to the defaults
    filterReset: function() {
        $('input[name=range-all], input[name=finance-type-all]').attr('checked', true).each(function() {
            $(this).triggerHandler('click');
        });

        var $slider = $('#price-slider');
        $slider.slider('values', 0, $slider.slider('option', 'min'));
        $slider.slider('values', 1, $slider.slider('option', 'max'));

        NISSAN.filterOffers();
    },

    formatCurrency: function(val, no_trim) {
        val += '';

        if (!no_trim) {
            val = val.replace(/\.0+$/, '');
        }

        var re = /^([\-+]?\d+)(\d{3})/;
        while (re.test(val)) {
            val = val.replace(re, '$1,$2');
        }

        return val;
    },

// Nissan pushes function
    pushesInit: function() {
        for (var i = 0; i <= this.config.pushes.panels.length; i++) {
            $('#push' + (i + 1)).flashembed({
                src: this.config.pushes.swf,
                wmode: 'transparent'
            }, this.config.pushes.panels[i]);
        }
    },

// Nissan flash header/footer functions
    resizeHeader: function(height) {
// The height the swf passes back is wrong
        height += 1;
        this.header_container.height(height);
    },
    positionFooter: function() {
        var w = this.window.height();
        var b = this.wrapper.outerHeight(true);
        if (b < w) {
            this.footer_container.css({ position: 'absolute', top: (b > w ? b : w) - this.footer_container.height() });
        }
    },
    headerFooterInit: function() {
        this.header_container.flashembed({
            src: this.config.headerFooter.shell,
            wmode: 'transparent'
        }, {
            confFile: this.config.headerFooter.conf,
            manifest: this.config.headerFooter.header,
            trvheader_resizeFunc: 'NISSAN.resizeHeader',
            trvheader_emebed: 'true'
        });

        this.footer_container.flashembed({
            src: this.config.headerFooter.shell,
            wmode: 'transparent'
        }, {
            confFile: this.config.headerFooter.conf,
            manifest: this.config.headerFooter.footer,
            trvheader_emebed: 'true'
        });

/*
        this.positionFooter();
        this.window.resize(function() {
            if (resizeTimeout) {
                clearTimeout(resizeTimeout);
            }
            resizeTimeout = setTimeout(function() {
                NISSAN.positionFooter();
            }, 250);
            var resizeTimeout = null;
        });
*/
    },

    eyeblaster: function(activity_id) {
        if (!activity_id) {
            return;
        }

        $(document.body).append('<script type="text/javascript" src="http://bs.serving-sys.com/BurstingPipe/ActivityServer.bs?cn=as&ActivityID=' + activity_id + '&rnd=' + (Math.random() * 1000000) + '"><\/script>');
    }
};

$(document).ready(function() { NISSAN.init(); });

