/**
 * @author Carlo Tasca (@brandammo ltd)
 * 
 * developed for carltonsports.com 2009
 * licensed to carltonsports.com 2009
 * 
 * all rights reserved
 * 
 */
/**
 * 
 * @param {Object} options
 */
// create closure
(function($){
    // plugin definition
    var initiating = true;
    var panelsHeadings = null;
    var itemsCounter = new Array();
    var beingAnimated = false;
    var carouselItems = null;
    var panel = null;
    var carouselItems = null;
    var carouselSize = 0;
    var increment = 0;
    var panelWidth =  0;
    var totViewable = 0;
    
    /**
     * Called after DOM has loaded
     */
    $.fn.rsorter = function(options){
        var $this = $(this);
        // build main options
        var opts = $.extend({}, $.fn.rsorter.defaults, options);
        $.fn.rsorter.panelLoader($this, panel, {},opts);
    }
    
    // HELPERS
    /**
     * load panel's list items
     */
    $.fn.rsorter.panelLoader = function(jqSelector,panel, postDataObject,opts){
    	// loop for each panel
    	jqSelector.each(function(i, panel){
        	// current panel
        	panel = '#' + $(this).attr('id');
        	itemsCounter[panel] = 1;
        	$.fn.rsorter.panelLoaderHelper(panel, {postkey : opts.postObject.params[i]}, opts);
        	var prev = $('.previous', panel);
    		var next = $('.next', panel);
			// attach prev and next listeners to current panel
			$.fn.rsorter.prevClickListener(panel, prev, opts);
			$.fn.rsorter.nextClickListener(panel, next, opts);
        });
    }
    /**
     * Helper for panelLoader function
     */
    $.fn.rsorter.panelLoaderHelper = function(panel, postObject, opts){
    	$('ul', panel).load(opts.dataProvider, postObject, function(){
    		carouselItems = $('ul li', panel);
    		carouselSize = carouselItems.size();
    		increment = carouselItems.outerWidth('true');
    		panelWidth =  $(panel).width();
    		totViewable = Math.round(panelWidth / increment);
    		$('ul', panel).css('width', (carouselSize + totViewable) * increment + increment + 'px');
    		// hide prev/next for panels with all elements in view
			if ($('ul li', panel).size() == totViewable)
			{
				$('.previous', panel).hide();
				$('.next', panel).hide();
			} else {
				// this branch takes care of resetting the prev/next commands to newly loaded panel. Call to show() method to enabled button in cases when they were hidden by if branch
				// gray-out the prev button
				$('.previous', panel).css({'background-position' : '0 -42px', 'cursor' : 'text'}).show();
				// reset the next button state to enabled
				$('.next', panel).css({'background-position' : '0 0', 'cursor' : 'pointer'}).show();
			}
    	});
    }
    /**
     * Return server data provider URL
     */
    $.fn.rsorter.serverDataProvider = function(opts){
    	return opts.dataProvider;
    }
    
    /**
     * previous button listener
     */
    $.fn.rsorter.prevClickListener = function (panel, o, opts)
    {
    	o.bind('click', function(e){
    		e.stopPropagation();
            e.cancelBubble = true;
            var stopAtItem = ($('ul li', panel).size() - totViewable) + 1;
            if (!beingAnimated && itemsCounter[panel] > 1)
            {
            	$.fn.rsorter.slidePanel(panel, '+');
            	itemsCounter[panel]--;
				beingAnimated = true;
            }

            if (itemsCounter[panel] == 1)
            {
            	//o.hide();
            	o.css({'background-position' : '0 -42px', 'cursor' : 'text'});
            	$('.next', panel).css({'background-position' : '0 0', 'cursor' : 'pointer'});
            }
            
            if (itemsCounter[panel] > 1 && itemsCounter[panel] < stopAtItem)
            {
            	$('.next', panel).css({'background-position' : '0 0', 'cursor' : 'pointer'});
            }
    	});
    }
    /**
     * previous button listener
     */
    $.fn.rsorter.nextClickListener = function (panel, o, opts)
    {
    	o.bind('click', function(e){
    		e.stopPropagation();
            e.cancelBubble = true;
            var stopAtItem = ($('ul li', panel).size() - totViewable) + 1;
            if (!beingAnimated && itemsCounter[panel] < stopAtItem)
            {
            	$.fn.rsorter.slidePanel(panel, '-');
            	itemsCounter[panel]++;
				beingAnimated = true;
            }
            if (itemsCounter[panel] == stopAtItem)
            {
            	// gray out next button
            	o.css({'background-position' : '0 -42px', 'cursor' : 'text'});
            }
            
            if (itemsCounter[panel] > 1)
            {
            	$('.previous', panel).show().css({'background-position' : '0 0', 'cursor' : 'pointer'});
            }
            
    	});
    }
      
     /**
      * Slide panel's items left or right
      */
     $.fn.rsorter.slidePanel = function(panel, direction) {
    	  $('ul', panel).animate({
				left: direction + "=" + increment,
				y: 0,
				queue: true
			}, 'normal',"swing",function(){beingAnimated = false;});
      }
      
      
    // plugin defaults
    $.fn.rsorter.defaults = {
    	dataProvider : '',	
    	postObject : {}
    };
    // end of closure
})(jQuery);
