var pmtlib = (function($) {
    var defaults = {
        image_link_selector: '#tourpictures-select .imglink',
        image_target_selector: '#tourimg'
    };
    
    var config = {};
    var c = config;

    var Tab = function(tab, pane) {
        this.tab = $(tab);
        this.pane = $(pane);
        this.id = this.tab.attr('id');
    };
    jQuery.extend(Tab.prototype, {
        is_active: function() {
            return (this.tab.is('.active') && this.pane.is(':visible'));
        },
        
        activate: function() {
            this.tab.addClass('active');
            this.pane.show();
        },
        
        deactivate: function() {
            this.tab.removeClass('active');
            this.pane.hide();
        },
        
        toggle: function() {
            if (this.is_active())
                this.deactivate();
            else
                this.activate();
        }
    });


    var TabList = function(container) {
        this.container = $(container);
        
        this.container.find('.panetitle').hide();

        var panes = {};
        var pane_keys = [];
        this.container.find('.pane').each(function() {
            panes[this.id] = this;
            pane_keys.push(this.id);
        });
        
        var has_pane = function(pane_id) {
            for(var i=0; i<pane_keys.length; i++) {
                if (pane_keys[i] == pane_id)
                    return true;
            }
            return false;
        };
        
        var tabs = [];
        this.container.find('.tab').each(function() {
            var tab_id = this.id;
            var pane_id = tab_id + 'content';
            if(has_pane(pane_id)) {
                tabs.push(new Tab(this, panes[pane_id]));
            }
        });
        
        this.tabs = tabs;
        this.activate_first();
    };
    
    jQuery.extend(TabList.prototype, {
        active_tab: function() {
            for(var i=0; i<this.tabs.length; i++) {
                if(this.tabs[i].is_active()) {
                    return this.tabs[i];
                }
            }
        },
        
        activate_first: function() {
            var tabs = this.tabs.slice(0);      // Like Python self.tabs[:]
            var first = tabs.shift();
            first.activate();
            jQuery.each(tabs, function(idx, tab) { tab.deactivate(); });
        },
        
        select: function(tabname) {
            var selected;
            for(var i=0; i<this.tabs.length; i++) {
                if(this.tabs[i].id == tabname) {
                    selected = this.tabs[i];
                    break;
                }
            }
            
            if(!selected)
                return;
            
            if(selected.is_active())
                return;
            
            this.active_tab().deactivate();
            selected.activate();
        }
    });

    /* TODO: Copy/translate 'image rotation' code in. */
    var make_image = function(src) {
        var img = new Image();
        img.src = src;
        return img;
    };
    
    var configure = function(){
        jQuery.extend(config, defaults);
        var tabs = new TabList('#tourtabs');

        var image_links = $(c.image_link_selector);
        var image_target = $(c.image_target_selector);
        var preload_cache = [];
        
        var image_sources = jQuery.map(image_links.get(), function(link) {
            var src = $(link).attr('href');
            preload_cache.push(make_image(src));
            return src;
        });

        var rotator = new rlist.PeriodicCycler(image_sources, 2, function(src) {
            image_target.attr({'src': src});
        });

        image_target.hover(
            /* mouseover: */ function() { rotator.pause(); return false; },
            /* mouseout: */  function() { rotator.resume(); return false; }
        );
        
        image_links
            .click(function() {
                image_target.attr({'src': this.href});
                rotator.stop();
                return false;
            })
            .hover(
                function() {
                    image_target.attr({'src': this.href}); 
                    rotator.pause(); 
                },
                function() { rotator.resume(); }
            );

        jQuery.extend(config, {
            'tabs': tabs,

            'image_links': image_links,
            'image_target': image_target,
            'preload_cache': preload_cache,
            'image_sources': image_sources,
            'rotator': rotator
        });
        
        $("a#statslink").click(function(){
            tabs.select('tab-tourstats');
            return false;
        });
        $("li.tab").not('#tab-zones').children('a').click(function() {
            var selected_tab_id = $(this).parent('li.tab').attr('id');
            tabs.select(selected_tab_id);
            return false;
        });
        $("li#tab-zones a").click(function() {
            tabs.select('tab-zones');
            image_target.attr({'src': $('a#tourthumb2').attr('href')});
            rotator.stop();
            return false;
        });
        
        rotator.start();
        return config;
    };
    
    // Auto configure if ``div#tourpage`` is found.
    $(document).ready(function() {
        if($('div#tourpage').length == 1)
            configure();
    });

    // EXPORT!
    return {
        'Tab': Tab,
        'TabList': TabList,
        
        'configure': configure,
        'get_configuration': function() { return config; }
    };
})(jQuery);
