(function($) {

    $.regionSelector = function(options) {
        return $.regionSelector.impl.init(options);
    };

    $.fn.regionSelector = function(options) {
        return $.regionSelector.impl.init(this, options);
    };

    /*
    * default options
    */
    $.regionSelector.defaults = {

};

$.regionSelector.impl = {

    /*
    * options
    */
    opts: null,

    /*
    * helper
    */
    helper: {},

    /*
    * animating
    */
    animating: false,

    /*
    * open
    */
    open: false,

    /*
    * Initialize the region selector
    */
    init: function(container, options) {

        var self = this;

        this.opts = $.extend({}, $.regionSelector.defaults, options);

        // helper objects
        self.helper.open = $('ul#nav-footer .li-regionselector a');
        self.helper.container = $(container);
        self.helper.regions = self.helper.container.find('.table-regions');

        // position
        self.position();

        // events
        self.events();

        return self;
    },

    /*
    * Position
    */
    position: function() {

        var self = this;
        var $content = $('div#content');
        var bottom;

        if ($.browser.msie && ($.browser.version < 7))
            bottom = $(document).height() - ($content.offset().top + $content.height()) - 4;
        else
            bottom = $(window).height() - ($content.offset().top + $content.height());

        // set the position
        self.helper.container
                .css({
                    left: $content.offset().left + 'px',
                    bottom: bottom + 'px'
                })
                ;

        return;
    },

    /*
    * Events
    */
    events: function() {

        var self = this;

        // open click
        self.helper.open
                .click(function(e) {
                    e.preventDefault();

                    if (self.animating == true)
                        return;

                    if (self.open == true) {
                        self.hide();
                    }
                    else {
                        self.show();
                    }
                })
                ;

        // region click
        self.helper.regions.find('a:not(".region-restofworld")')
                .click(function(e) {
                    e.preventDefault();

                    if (self.animating == true)
                        return;

                    if ($(this).parent().hasClass('active'))
                        return;

                    $(this).parent()
                        .addClass('active')
                        .siblings()
                        .removeClass('active')
                        ;

                    var region = $(this).attr('class');

                    self.region(region);
                })
                ;

        return;
    },

    /*
    * Region
    */
    region: function(region) {

        var self = this;

        var $region = self.helper.container.find('table.' + region);

        $region
                .addClass('region-active')
                .css({
                    opacity: '0.00',
                    display: 'block'
                })
                ;

        var regionsH = self.helper.regions.height();
        var regionH = $region.height();
        var h = (regionsH > regionH) ? regionsH : regionH;

        self.animate(h);

        $region
                .fadeTo(1000, '1.00')
                ;

        self.helper.container.find('table.table-countries:not(".' + region + '")')
                .fadeOut(1000)
                ;

        return;
    },

    /*
    * Show
    */
    show: function() {

        var self = this;

        self.helper.open.parent()
                .addClass('li-1-active')
                ;

        self.helper.regions
                .css({
                    opacity: '0.00',
                    display: 'block'
                })
                ;

        self.animate(self.helper.regions.height());

        self.helper.regions
                .fadeTo(1000, '1.00')
                ;

        return;
    },

    /*
    * Hide
    */
    hide: function() {

        var self = this;

        self.helper.open.parent()
                .removeClass('li-1-active')
                ;

        self.helper.container.find('table')
                .fadeOut(1000)
                ;

        self.animate(0);

        self.helper.regions.find('li')
                .removeClass('active')
                ;

        return;
    },

    /*
    * Animate
    */
    animate: function(h) {

        var self = this;

        self.animating = true;

        self.helper.container
                .animate({ height: h + 'px' }, 1000, 'easeOutExpo', function() {

                    self.animating = false;

                    if (h == 0)
                        self.open = false;

                    else
                        self.open = true;
                })
                ;

        return;
    }

};
})(jQuery);
