var bachelor_heroes = (function($){
    var m = MochiKit.Base,
        itertools = MochiKit.Iter,
        ll = linkedlist;

    var config = {
        cycler: null,
        list_iterator: null,
        started: false,
        
        // These should all be set in the options passed to 'start', but
        // are recorded here for some sense of clarity.
        seconds_to_display: 5,
        transition_speed: 600,

        container: '#hero-image-container',
        image_holder: '#hero-image-imgholder',
        link_holder: '#hero-image-link',
        previous_button: '#hero-box-left-button',
        next_button: '#hero-box-right-button',
        
        promo_records: []
    };
    var c = config;
    
    var fadein_promo = function(promo) {
        var old_image_source = $(c.image_holder).attr('src');
        /* Callback used to set link */
        var on_fadein_complete = function() {
            $(c.link_holder).attr({href: promo.promo_url || ""});
        };
        
        /* 1. Copy the current image to the background (container)
         * 2. Clear the current link href
         * 3. Hide 'image_holder', set source to be promo's image_source,
         *    and fade the image in. AFter fading in, 
         */
        $(c.container)
            .css({'background-image': 'url('+old_image_source+')'})
            .find(c.link_holder).attr({href: ""}).end()
            .find(c.image_holder)
                .hide()
                .attr({'src': promo.image_source, 'alt': promo.title})
                .animate(
                    {opacity: 'show'},
                    {duration: c.transition_speed,
                     complete: on_fadein_complete}
                )
            .end();
    };
    var show_previous_hero = function() {
        var previous = config.list_iterator.previous();
        fadein_promo(previous);
    };
    var show_next_hero = function() {
        var next = config.list_iterator.next();
        fadein_promo(next);
    };
    
    var start = function(options) {
        if(config.started) {
            return false;
        }
        jQuery.extend(config, options || {});
        
        config.started = true;

        /* Now, build the cycler to rotate and fade this shit in and out */

        var promo_list = ll.Double(config.promo_records, {circular: true});
        config.list_iterator = itertools.iter(promo_list);
        config.list_iterator.next();
        config.cycler = new rlist.PeriodicCycler(
            config.list_iterator,
            config.seconds_to_display,
            fadein_promo
        );
        
        $(c.container).hover(
            function() {config.cycler.pause(); return false;},
            function() {config.cycler.resume(); return false;}
        );
        
        $(c.previous_button).click(function() {
            if(config.cycler.currentlyExecuting) {
                return false;
            }
            show_previous_hero();
            return false;
        });
        
        $(c.next_button).click(function() {
            if(config.cycler.currentlyExecuting) {
                return false;
            }
            show_next_hero();
            return false;
        });
        
        config.cycler.start();
    };
    
    // Exported Names
    return {
        start: start,
        // Additional helpers for debugging
        fadein_promo: fadein_promo,
        get_config: function() {return config;},
        get_cycler: function() {return config.cycler;}
    };
    
})(jQuery);


var bachelor_topnews = (function($){
    var m = MochiKit.Base,
        itertools = MochiKit.Iter,
        ll = linkedlist;

    var config = {
        cycler: null,
        list_iterator: null,
        started: false,
        
        // These should all be set in the options passed to 'start', but
        // are recorded here for some sense of clarity.
        seconds_to_display: 5,
        transition_speed: 600,
        
        container: '#news-bar-inner',
        news_items: []
    };
    var c = config;

    var rotate_handler = function(newsitem) {
        var on_fadeout_complete = function() {
            $(c.container)
                .html($(newsitem).html())
                .show(c.transition_speed);
        };

        $(c.container).hide(c.transition_speed, on_fadeout_complete);
        
        // $(c.container).animate(
        //     {opacity: 'hide'},
        //     {duration: c.transition_speed,
        //      complete: on_fadeout_complete}
        // );
    };

    var start = function(options) {
        if(config.started) {
            return false;
        }
        jQuery.extend(config, options || {});
        
        config.started = true;
        var newsitem_list = ll.Double(config.news_items, {circular: true});
        config.list_iterator = itertools.iter(newsitem_list);
        config.list_iterator.next();
        config.cycler = new rlist.PeriodicCycler(
            config.list_iterator,
            config.seconds_to_display,
            rotate_handler
        );
        
        config.cycler.start();
    };

    // Exported Names
    return {
        start: start,
        get_config: function() {return config;},
        get_cycler: function() {return config.cycler;}
    };
})(jQuery);
