 $(function() {
    $.fn.extend({
        photoBalls: function(options) {
            var defaults = {
			   slideElement	: ".slide1",
			   pagerElement	: ".pager dd ol li",
			   pagerActive	: "on",					// Has to be a class
			   startRandom	: true,
			   delay		: 10000,
			   nextButton	: ".hpArrowRight",
			   prevButton	: ".hpArrowLeft",	
			   
			   startSliding	: function(){},
			   
			   timeOutSlider: null,
			   me			: null
            };

            var options = $.extend(defaults, options);

            return this.each(function() {
				// Set me
				options.me = $(this);
				
				// Bindings
				$(this).bind("startSliding", options.startSliding);
				
				// Generate random
				if(options.startRandom)
				{
					var rand = randomNumber($(this).find(options.slideElement).length);
					selectElement(rand);
				}
				else
				{
					selectElement(0);	
				}

				// Start random using
				options.timeOutSlider = setInterval(showNext, options.delay);
				
				// Do the onclick
				$(options.pagerElement).click(selectThisElement);
				
				// Next/Prev on click
				$(options.nextButton).click(showNext);
				$(options.prevButton).click(showPrev);
			
                return this;
            });
			
			// Random number between 0 and maxValue
			function randomNumber(maxValue)
			{
				return Math.floor(Math.random()*maxValue);
			}
			
			// Show the next element
			function showNext()
			{
				var $me = options.me;	
				var selectedIndex = getSelectedIndex();
				
				// Is last selected?
				if(selectedIndex + 1 == $(options.pagerElement).length)
					selectElement(0);
				else
					selectElement(selectedIndex + 1);	
			}
			
			// Show the prev element
			function showPrev()
			{
				var $me = options.me;	
				var selectedIndex = getSelectedIndex();
				
				// Is last selected?
				if(selectedIndex == 0)
					selectElement($(options.pagerElement).length - 1);
				else
					selectElement(selectedIndex - 1);	
			}
			
			// Select a element
			function selectElement(newIndex)
			{				
				// Clear interval
				if(options.timeOutSlider)
					clearInterval(options.timeOutSlider);
					
				var $me = options.me;
				$me.trigger("startSliding", newIndex);				

				// Update pager
             	$(options.pagerElement)
						.removeClass(options.pagerActive)
						.eq(newIndex)
						.addClass(options.pagerActive);
				
				// Select random element
				$me		.find(options.slideElement)
						.fadeOut()
						.eq(newIndex)
						.fadeIn();
				
				options.timeOutSlider = setInterval(showNext, options.delay);
			}
			
			// Select the clicked element
			function selectThisElement()
			{				
				// Select the new element
				var $me = options.me;
				var index = $(options.pagerElement).index($(this));	
				selectElement(index);
			}
			
			// Return the selected index
			function getSelectedIndex()
			{
				var $me = options.me;
				var index = -1;
				$(options.pagerElement).each(function(i){
					if($(this).hasClass(options.pagerActive))
						index = i;
				});
				return index;
			}
			
        }
    });
});

