﻿(function($)
{
	$.fn.slider = function(settings)
	{
		// Config Array
		var config = $.extend(
		{ 
			type:					"slide",
			
			direction:				"hor",
			timeDelay:				350,
			loopItems:				true,
			autoSlide:				true,
			mouseDisable:			true,
			autoSlideDelay:			5000,
			
			defaultVertNum:			3,
		
			btnNextStr:				"slider-btnNext",
			btnPrevStr:				"slider-btnPrev",
			btnDisabledStr:			"-dis",
			btnHoverStr:			"-over",
			btnOpacityOff:			1,
			btnOpacityOver:			1,
			
			slideItemClass:			"slideItem",
			slideItemHolder:		"slider-holder",
			slideItemBound:			"slider-bound"
		}, settings || {});
		
		var slider = $(this);
		
		// Variables to determine the position of the slider
		var currentItem = 0;
		var pos = 0;
		var prevPos = [];
		var timer;
		
		var numItemsTotal;
		var moveVal;
		var numItemsVisible;
		var holder;
		var marginItemVal;
		var marginHolderVal;
		var originalChildren;
		var currentPreviousIndex;
		
		var btnNext;
		var btnPrev;
						
						
						
						
		var sliderPosition;
		var isTimerSet = false;
		
		function checkPosition(event)
		{	
			if (event.pageX > sliderPosition.left && event.pageX < (sliderPosition.left + slider.width()) && event.pageY > sliderPosition.top && event.pageY < (sliderPosition.top + slider.height() + 50))
			{
				if (isTimerSet === true)
				{	
					isTimerSet = false;
					clearTimer();
				}
			}
			else
			{
				//alert(isTimerSet);
				
				
				
				if (isTimerSet === false)
				{
					//alert(isTimerSet);
					isTimerSet = true;
					clearTimer();
					
					if (numItemsTotal > 1)
					{
						setTimer();
					}
				}
				//alert('here');
				//setTimer();
			}
		}
						
			
						
						
		function initSlider()
		{
			sliderPosition = slider.position();
			$(document).bind('mousemove', checkPosition);
			
			
			
			// Insert the HTML necessary to create the slider
			slider.html(setHTML(slider));
			slider.css({display: 'block'});
			
			numItemsTotal = $('.' + config.slideItemClass, slider).length;
			moveVal = (config.direction == "hor") ? $('.' + config.slideItemClass, slider).outerWidth(true) : $('.' + config.slideItemClass, slider).outerHeight(true);
			numItemsVisible = (config.direction == "hor") ? Math.floor(slider.outerWidth() / moveVal) : config.defaultVertNum;
			holder = $('.' + config.slideItemHolder, slider);
			marginItemVal = (config.direction == "hor") ? moveVal - $('.' + config.slideItemClass, slider).width() : moveVal - $('.' + config.slideItemClass, slider).height(); 
			marginHolderVal = (config.direction == "hor") ? parseInt(($('.' + config.slideItemBound, slider).css("margin-left"))) : parseInt(($(slider).css("padding-top")));
			originalChildren = $('.' + config.slideItemClass, slider);
			currentPreviousIndex = originalChildren.length - 1;
			
			originalChildren.each(function(num)
			{
				$(this).css({left: (num * moveVal) + 'px'}).removeClass('hide');
			});
			
			if (config.direction == "hor")
			{
				slider.css({width: ((moveVal * numItemsVisible) + (marginItemVal + marginHolderVal)) + 'px'});	
				//if ($.browser.msie && $.browser.version == "6.0") { slider.css({height: (slider.outerHeight() - 2) + 'px'}); }
			}
			else
			{			
				if ($.browser.msie && $.browser.version == "6.0") { slider.css({width: (slider.width() - 2) + 'px'}); }
				slider.css({height: ((moveVal * numItemsVisible) - marginHolderVal) + 'px'});
				
				$('.' + config.slideItemBound).css({height: slider.height() + 'px'});
			}
						
			// Variables to hold the previous and next buttons
			btnNext = $("." + config.btnNextStr, slider);
			btnPrev = $("." + config.btnPrevStr, slider);
			
			// Removed the href link from the buttons and set the previous button to disabled
			btnPrev.removeAttr('href').css({cursor: "pointer"});
			btnNext.removeAttr('href').css({cursor: "pointer"});
			if (!config.loopItems) { disableBtn(btnPrev, config.btnPrevStr); }
			
			// This is to prevent a flicker while the page is loading
			// The buttons are set to invisible in the CSS
			btnNext.css({display: 'block', opacity: config.btnOpacityOff});
			btnPrev.css({display: 'block', opacity: config.btnOpacityOff});
			
			
			// -- START EXTRA CODE -- \\
			
				var hdr_height = $('.header-holder').height();
			
				var ss_height = slider.height() - hdr_height;
				btnNext.css({height: ss_height + 'px'});
				btnPrev.css({height: ss_height + 'px'});
				
				
				var img_height = $('img', btnNext).attr('height');
				var span_height = $('.btnPrev-span').height();
				var yPosSpan = hdr_height + Math.round((ss_height - span_height) / 2);
				var yPosImg = hdr_height + Math.round((ss_height - img_height) / 2);
				
				$('img', btnNext).css({opacity: .7, top: yPosImg + 'px'});
				$('img', btnPrev).css({opacity: .7, top: yPosImg + 'px'});
				
				$('.btnPrev-span').css({opacity: 0.3, top: yPosSpan + 'px'});
				$('.btnNext-span').css({opacity: 0.3, top: yPosSpan + 'px'});
			// -- END EXTRA CODE -- \\
			
			// If the number of items is less than or equal to the number of items visible - disable the next button
			if (numItemsTotal <= numItemsVisible) 
			{ 
				if (config.loopItems)
				{
					 btnNext.css({display: 'none'});
					 btnPrev.css({display: 'none'});
				}
				else
				{
					disableBtn(btnPrev, config.btnPrevStr); 
					disableBtn(btnNext, config.btnNextStr);
				}
			}
			
			// Setup a timer if the slider is set to automatic
			if (config.autoSlide && numItemsTotal > numItemsVisible)
			{
				(!isTimerSet)
				{
					setTimer();
				}
				
				if (config.mouseDisable)
				{
					slider.mouseover(function()
					{
						clearTimer();
					}).mouseout(function()
					{
						setTimer();
					});
				}
			}
		
			// Next Button Functionality
			btnNext.mouseover(function()
			{
				addHoverBtn($(this), config.btnNextStr);
			}).mouseout(function()
			{
				removeHoverBtn($(this), config.btnNextStr);
			});
			/*
			.click(function()
			{			
				//clearTimer();
				nextItem();
			});
			*/
			
			btnNext.bind('click', nextItem);
			
			// Previous Button Functionality
			btnPrev.mouseover(function()
			{
				addHoverBtn($(this), config.btnPrevStr);
			}).mouseout(function()
			{
				removeHoverBtn($(this), config.btnPrevStr);
			});
			/*.click(function()
			{
				//clearTimer();
				prevItem();
			});
			*/
			btnPrev.bind('click', prevItem);
		}
		
	//  ========== FUNCTIONS ==========  \\		
		function nextItem()
		{
			btnNext.unbind('click', nextItem);
			
			if (!config.loopItems)
			{
				if (currentItem < numItemsTotal - numItemsVisible)
				{
					pos -= moveVal;
				
					moveSlider(holder, pos, config.timeDelay, 'next');
					currentItem++;
					
					enableBtn(btnPrev, config.btnPrevStr);
					(checkMaxValue(currentItem, numItemsTotal - numItemsVisible)) ? disableBtn(btnNext, config.btnNextStr) : enableBtn(btnNext, config.btnNextStr);
				}
			}
			else
			{
				pos = -(moveVal);
				positionSlider(currentItem, 'next');
				moveSlider(holder, pos, config.timeDelay, 'next');
				
				if (currentItem >= numItemsTotal - 1)
				{
					currentItem = 0;
				}
				else
				{
					currentItem++;
				}
			}
		}
				
		function prevItem()
		{
			btnPrev.unbind('click', prevItem);
						
			if (!config.loopItems)
			{
				if (currentItem > 0)
				{
					pos += moveVal;
				
					moveSlider($(holder), pos, config.timeDelay, 'prev');
					currentItem--;
					
					enableBtn(btnNext, config.btnNextStr);				
					(checkMinValue(currentItem, 0)) ? disableBtn(btnPrev, config.btnPrevStr) : enableBtn(btnPrev, config.btnPrevStr);
				}
			}
			else
			{
				pos = moveVal;
				
				positionSlider(currentItem, 'prev');
				moveSlider(holder, pos, config.timeDelay, 'prev');
				
				if (currentItem == 0)
				{
					currentItem = numItemsTotal - 1;
				}
				else
				{
					currentItem--;
				}
			}
		}
		
		function positionSlider(num, dir)
			{
				if (dir == 'next')
				{
					$(holder).css({left: 0});
								
					var nextItem = num + 1;
					if (nextItem >= numItemsTotal)
					{
						nextItem = 0;
					}
					
					$('.slideItem', holder).each(function(e)
					{
						if (e == num)
						{
							$(this).css({left: 0});
						}
						else if (e == nextItem)
						{
							$(this).css({left: moveVal + 'px'});
						}
						else
						{
							$(this).css({left: (moveVal * 2) + 'px'});
						}
					});
				}
				else if (dir == 'prev')
				{
					$(holder).css({left: 0});
					var prevItem = num - 1;
					if (prevItem < 0)
					{
						prevItem = numItemsTotal - 1;
					}
					
					$('.slideItem', holder).each(function(e)
					{
						if (e == num)
						{
							$(this).css({left: 0});
						}
						else if (e == prevItem)
						{
							$(this).css({left: -(moveVal) + 'px'});
						}
						else
						{
							$(this).css({left: (moveVal * 2) + 'px'});
						}
					});
				}
			}
		
		function moveSlider(holder, pos, time, dir)
			{				
				clearTimer();
				setTimer();
				
				switch(config.type)
				{
					case "slide":
						if (config.direction == "vert")
						{
							$(holder).animate({ top: pos + "px" }, time)
						}
						else
						{							
							var ctnNum;
							
							if (dir == 'prev')
							{
								ctnNum = (currentItem == 0) ? numItemsTotal - 1 : currentItem - 1;
							}
							else
							{
								ctnNum = (currentItem >= numItemsTotal - 1) ? 0 : currentItem + 1;
							}
							
							var ctnPos = $('.ss-ctn:eq(' + ctnNum + ')', holder).position();
							var left = ctnPos.left;
							var moveVal = (dir == 'next') ? 150 : -150;
							
							$('.ss-ctn:eq(' + ctnNum + ')', holder).css({left: (left + moveVal) + 'px'}).animate({left: left + 'px'}, (time * 1.3));
							$(holder).animate({ left: pos + "px" }, time, function()
							{
								if (dir == 'next')
								{
									btnNext.bind('click', {obj: btnNext}, nextItem);
								}
								else if (dir == 'prev')
								{
									btnPrev.bind('click', {obj: btnPrev}, prevItem);
								}
							});
						}
						
						break;
				}
			}
		function enableBtn(btn, str)
			{
				btn.removeClass(str + config.btnDisabledStr).css({cursor: "pointer"});
			}
		function disableBtn(btn, str)
			{
				btn.addClass(str + config.btnDisabledStr).css({cursor: "default"});
			}
		function addHoverBtn(btn, str)
			{
				btn.addClass(str + config.btnHoverStr);
				btn.css({opacity: config.btnOpacityOver});
			}
		function removeHoverBtn(btn, str)
			{
				btn.removeClass(str + config.btnHoverStr);
				btn.css({opacity: config.btnOpacityOff});
			}
		function setTimer()
			{
				//alert('set');
				
				//isTimerSet = true;
				timer = setInterval(timerNext, config.autoSlideDelay);
			}
		function timerNext()
			{
				nextItem({obj: btnNext});
			}
		function clearTimer()
			{
				//alert('clear');
				
				//isTimerSet = false;
				clearInterval(timer);
			}
			
		// Add the HTML to create the slider
		function setHTML(this_obj)
			{
				var html_str = '';
				html_str += '<a href="/" class="' + config.btnPrevStr + '"><img src="/images/arrow-slideshow-prev.gif" width="8" height="16" /><span class="btnPrev-span">Prev</span></a>';
				html_str += '<a href="/" class="' + config.btnNextStr + '"><img src="/images/arrow-slideshow-next.gif" width="8" height="16" /><span class="btnNext-span">Next</span></a>';
				html_str += '<div class="' + config.slideItemBound + '">';
				html_str += '<div class="' + config.slideItemHolder + ' clearfix">';
				html_str += this_obj.html();
				html_str += '</div></div>';
				return html_str;
			}
		
		// Check Maximum Value to set appropriate state on buttons
		function checkMaxValue(num, maxnum)
		{
			if (num == maxnum) { return true; }
		}
		// Check Minimum Value to set appropriate state on buttons
		function checkMinValue(num, minnum)
		{
			if (num == minnum) { return true; }
		}
		
		initSlider();
	};
})(jQuery);
