(function($){
    var settings = {
      'infinite_loop': true,
      'autoplay': true,
      'interval': 5000,
      'interval_id' : 0
    };
    
    $.fn.moduleSpotlight = function(options) {
        return this.each(function() {
            if (options) $.extend(settings, options);
            methods.clone_ends($(this));
            methods.init($(this));
            methods.bindControls($(this), true);
            methods.pan(0,$(this), true);
            //buggy: if (settings.autoplay) methods.autoplay($(this));
            //buggy? $(_contents).find ...
        });
    }
    var methods = {
        init : function(_contents) {
            var windowWidth = 0;
            var pageCounter = 0;
            $(_contents).find('.window .panel').each(function() {
              if(!$(this).hasClass('clone')) {
                $(_contents).find('.pagination').append('<a rel="' + (++pageCounter) + '" href="#">•</a>'); 
                //$('<a rel="' + (++pageCounter) + '" href="#">•</a>').appendTo($(_contents).find('.pagination'));
              }
              windowWidth += $(this).width();
            });
            if($(_contents).find('.pagination a').length) $(_contents).find('.pagination').slideDown();
            
            $(_contents).find('.window').css('width',windowWidth+777); // wiggle room
            $(_contents).find('.window .panel').not('.clone').filter(':first-child').toggleClass('viewing');
            $(_contents).find('.pagination a:first-child').toggleClass('viewing');
            var some_var = 'ninja'; /* this is absolutely necessary */
        },
        
        clone_ends : function(_contents) {
            var frst = $(_contents).find('.window .panel').filter(':first-child').clone().addClass('clone');
            var last = $(_contents).find('.window .panel').filter(':last-child').clone().addClass('clone');
            $(_contents).find('.window').prepend(last);
            $(_contents).find('.window').append(frst);
        },
        
        ui_reset : function(_page, _contents) {
            $(_contents).find('.window .panel').removeClass('viewing');
            $(_contents).find('.pagination a').removeClass('viewing');
            $($(_contents).find('.window .panel').not('.clone')[_page]).addClass('viewing');
            $($(_contents).find('.pagination a').not('.clone')[_page]).addClass('viewing');
        },
        
        pan : function(_page, _contents, _init) {
            methods.unbindControls(_contents);
            if(settings.interval_id) methods.stopAutoplay(_contents);
            
            if(_init) {
                $(_contents).find('.window').css('left', -$($(_contents).find('.window .panel').not('.clone')[_page]).position().left);
                methods.ui_reset(_page, _contents);
                methods.bindControls(_contents);
                methods.autoplay(_contents);
            } else if(_page>-1 && _page< $(_contents).find('.pagination a').length) {
                methods.ui_reset(_page, _contents);
                $(_contents).find('.window').animate({left: -$($(_contents).find('.window .panel').not('.clone')[_page]).position().left + 'px'}, function() {
                    methods.bindControls(_contents);
                    methods.autoplay(_contents);
                });        
            } else if((_page == -1) && settings.infinite_loop) {
                var page = $(_contents).find('.pagination a').length-1;
                methods.ui_reset(page, _contents);
                $(_contents).find('.window').animate({left: '0px'}, function() { 
                    $(_contents).find('.window').css('left', -$($(_contents).find('.window .panel').not('.clone')[page]).position().left);
                    methods.bindControls(_contents);
                    methods.autoplay(_contents);
                });                            
            } else if((_page == $(_contents).find('.pagination a').length) && settings.infinite_loop) {
                var page = 0;
                methods.ui_reset(page, _contents);
                $(_contents).find('.window').animate({left: -$(_contents).find('.window .panel:last-child').position().left + 'px'}, function() { 
                    $(_contents).find('.window').css('left', -$($(_contents).find('.window .panel').not('.clone')[page]).position().left);
                    methods.bindControls(_contents);
                    methods.autoplay(_contents);
                });                            
            } else {
                methods.bindControls(_contents);
                if(settings.interval_id) methods.autoplay(_contents);
            }
        },
        
        unbindControls : function(_contents) {
            $(_contents).find('.controls .next').unbind('click.spotlight');
            $(_contents).find('.controls .previous').unbind('click.spotlight');
            $(_contents).find('.pagination a').unbind('click.spotlight');
        },
        
        bindControls : function(_contents, _init) {
            $(_contents).find('.controls .next').bind('click.spotlight', function(event) { 
                //JQ1.4 methods.pan($(_contents).find('.window .panel.viewing').next().index()-1, _contents);
                methods.pan($(_contents).find('.window .panel').index($('.window .panel.viewing').next())-1, _contents);
                //event.preventDefault();
            });
            if(_init) $(_contents).find('.controls .next').click(function(event) { event.preventDefault(); });
            
            $(_contents).find('.controls .previous').bind('click.spotlight', function(event) { 
                //JQ1.4 methods.pan($(_contents).find('.window .panel.viewing').prev().index()-1, _contents); 
                methods.pan($(_contents).find('.window .panel').index($('.window .panel.viewing').prev())-1, _contents); 
                //event.preventDefault();
            });
            if(_init) $(_contents).find('.controls .previous').click(function(event) { event.preventDefault(); });
            
            $(_contents).find('.pagination a').bind('click.spotlight', function(event) { 
                methods.pan($(this).attr('rel')-1, _contents); 
                //event.preventDefault();
            });
            if(_init) $(_contents).find('.pagination a').click(function(event) { event.preventDefault(); });
        },
        
        autoplay : function(_contents) {
            if (settings.autoplay) {
              settings.interval_id = setInterval(function() {
                $(_contents).find(".controls .next").click();
              },settings.interval);
            }
        },
        
        stopAutoplay : function(_contents) {
            clearInterval(settings.interval_id);
        }
    };
})(jQuery);
