/**
 * @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 rangesDisplay = true;
    var hhDisplay = false;
    var lsDisplay = false;
    var initiating = true;
    var panelsHeadings = null;
    var ranges = ['Vapour Trail', 'Air Rage', 'Airblade']; // tot elem = tot of panels
    var racket_params = ['Power', 'Control', 'Manoeuvrability']; // tot elem = tot of panels
    var orderBy_suffix = ['power', 'control', 'man']; // tot elem = tot of panels
    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);
        // select panels headings
        panelsHeadings = $('#panels h1.highlighted');
        // // init state of filters
        $.fn.rsorter.filterBtnBinder($('#ranges'), $this, opts);
        $.fn.rsorter.filterBtnBinder($('#hh'), $this, opts);
        $.fn.rsorter.filterBtnBinder($('#ls'), $this, opts);
        // set heading for panels
        $.fn.rsorter.setDisplayHeading();
        $.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;
        	// feed ul tag with items
        	// what to load?
        	if (rangesDisplay)
        	{
        		postDataObject.range = ranges[i].toLowerCase();
        		postDataObject.hh = false;
        		postDataObject.ls = false;
        	}
        	if (hhDisplay)
        	{
        		postDataObject.range = false;
        		postDataObject.hh = true;
        		postDataObject.ls = false;
        		postDataObject.param = 'hh' + orderBy_suffix[i];
        	}
        	if (lsDisplay)
        	{
        		postDataObject.range = false;
        		postDataObject.ls = true;
        		postDataObject.hh = false;
        		postDataObject.param = 'ls' + orderBy_suffix[i];
        	}
        	$.fn.rsorter.panelLoaderHelper(panel, postDataObject);
        	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);
			// gray-out all previous buttons
			//$('.previous').css({'background-position' : '0 -42px', 'cursor' : 'text'});
			
        });
    }
    /**
     * Helper for panelLoader function
     */
    $.fn.rsorter.panelLoaderHelper = function(panel, postObject){
    	$('ul', panel).load($.fn.rsorter.serverDataProvider(), 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(){
    	if (rangesDisplay)
    	{
    		return 'http://www.carltonsports.com/rackets_ranges_filter.php';
    	}
    	if (hhDisplay || lsDisplay)
    	{
    		return 'http://www.carltonsports.com/rackets_hhls_filter.php';
    	}
    }
    
    /**
     * click event binding function for filter buttons
     */
    $.fn.rsorter.filterBtnBinder = function(o, jqSelector,opts){
    	// bind click to object
        o.bind('click', function(e){
        	// remove any selected state from filters
        	$('.filter_btn').removeClass('selected');
            e.stopPropagation();
            e.cancelBubble = true;
            o.addClass('selected');
            switch (o.attr('id'))
            {
            	case 'ranges':
            		rangesDisplay = true;
            		hhDisplay = false;
            		lsDisplay = false;
            		$.fn.rsorter.resetPanels(opts);
            		$.fn.rsorter.panelLoader(jqSelector, panel, {},opts);
            		break;
            	case 'hh':
            		hhDisplay = true;
            		rangesDisplay = false;
        			lsDisplay = false;
        			$.fn.rsorter.resetPanels(opts);
        			$.fn.rsorter.panelLoader(jqSelector, panel, {},opts);
            		break;
            	case 'ls':
            		lsDisplay = true;
        			rangesDisplay = false;
            		hhDisplay = false;
            		$.fn.rsorter.resetPanels(opts);
            		$.fn.rsorter.panelLoader(jqSelector, panel, {},opts);
            		break;
            }
            initiating = false;
            $.fn.rsorter.setDisplayHeading();
        });
        return false;
    };
    
    /**
     * set panels headings
     */
    $.fn.rsorter.setDisplayHeading = function ()
    {
    	// if initiating is false, a filter button was clicled
    	// apply headings to panels
    	if (!initiating)
    	{
    		if (rangesDisplay == true)
	    	{
	    		panelsHeadings.each(function(i){
	    			$current = $(this);
	    			$current.html(ranges[i]);
	    		});
	    	} else {
	    		// either hh or ls
	    		var headingHelper = hhDisplay ? 'Hard Hitter' : 'Long Swing';
	    		panelsHeadings.each(function(i){
	    			$current = $(this);
	    			$current.html(racket_params[i]);
	    		});
	    	}
    	}
    }
    
    /**
     * 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'});
            }
            
            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();
            	$('.previous', panel).show().css({'background-position' : '0 0', 'cursor' : 'pointer'});
            }
    	});
    }
     
     /**
      * Reset items counter for filter buttons
      */
     $.fn.rsorter.resetPanels = function(opts){
    	 beingAnimated = false;
    	 carouselItems = null;
    	 carouselSize = 0;
    	 increment = 0;
    	 panelWidth =  0;
    	 totViewable = 0;
     	 $('.rackets_panel').each(function (i) {
     		panel = '#' + $(this).attr('id');
     		itemsCounter[panel] = 1;
     		$('ul', panel).css('left', '0px');
     	 });
     }
      
     /**
      * 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 = {
    
    };
    // end of closure
})(jQuery);
