/* ========================================================================================

		jQuery Slider Class  //	version 1.0 // Dave @ Citrus

   ======================================================================================== */


var Slider = function(args) {
	
	var self = this;
	
	// default public vars
	var defaults = {
		display_height: 153, /* 148 */
		shift_height: 102,
		element_height: 51, /* 46 */
		max_elements_visble: 3,
		max_elements_shift: 2,
		container: $("#promotions div.brief"),
		slider_element: $("#promotions ul.brief"),
		arrow: $("#promotions img.arrow-button"),
		arrow_up: $("#promotions div.brief a.up-arrow"),
		arrow_down: $("#promotions div.brief a.down-arrow")
	};
	
	// private vars
	var _noElements = 0; // calc number elements
	var _sliderHeight = 0;
	var _cssTop = 0;
	var _visElements = 0;	
	
	// if not args pass define empty object
	if (typeof args != 'object') { args = {} }
	
	for (var k in defaults) {
		if (typeof args[k] == 'undefined') {
			args[k] = defaults[k];
		}
		self[k] = args[k];
	}
	
	self.test = function() {
		alert(self.display_height);
	};
	
	// --------------------------------------------------------------------------------------
	var _arrowMouseover = function(obj) {
		if (!$(obj).parent().hasClass('disabled')) {
			var img = $(obj);
			var currentSrc = img.attr("lowsrc");
			img.attr("lowsrc", currentSrc);
			var hoverSrc = currentSrc.replace(/off/, "on");				
			img.attr("src", hoverSrc);
		}					
	};
	
	// --------------------------------------------------------------------------------------
	var _arrowMouseout = function(obj) {
		if (!$(obj).parent().hasClass('disabled')) {
			var img = $(obj);			  
			var oldSrc = img.attr("lowsrc");
			img.attr("src", oldSrc);
		}
	};
	
	// --------------------------------------------------------------------------------------
	var _arrowDisable = function(obj) {
		var img = $(obj);
		var currentSrc = img.attr("lowsrc");
		
		if (currentSrc.search(/on/) >= 0) {
			currentSrc.replace(/on/, "off");
		}
		
		img.attr("lowsrc", currentSrc);
		var hoverSrc = currentSrc.replace(/off/, "disabled");				
		img.attr("src", hoverSrc);
		img.parent().addClass('disabled');					
	};
	
	// --------------------------------------------------------------------------------------
	_arrowEnable = function(obj) {
		if ($(obj).parent().hasClass('disabled')) {
			var img = $(obj);
			var currentSrc = img.attr("lowsrc");
			var hoverSrc = currentSrc.replace(/disabled/, "off");
			img.attr("src", hoverSrc);
			img.parent().removeClass('disabled');
		}
	};
	
	// --------------------------------------------------------------------------------------
	self._slideDown = function(pos) {
	
		_cssTop = parseInt(self.slider_element.css('top'));	// get current postion of the promotions slider
		_visElements = self.max_elements_visble;
		
		// calculate how may promotions are visible or have been visible on downward slide
		if (_cssTop != 0) { _visElements += Math.abs(_cssTop) / self.element_height; }
		
		if (typeof pos == 'undefined') {
		
			// if total promotions less visible promotions is greater than or equal to maximum slider shift.
			if ((_noElements - _visElements) >= self.max_elements_shift) {
				_cssTop = _cssTop - (self.element_height * self.max_elements_shift);
				_visElements += self.max_elements_shift;
			} else {
				_cssTop = _cssTop - (self.element_height * (_noElements - _visElements));
				_visElements += (_noElements - _visElements);						
			}
		} else {
		
			if (isNaN(pos)) { return false; }
			
			if (pos == 1) {
				_cssTop = 0;
				_visElements = self.max_elements_visble;
			} else if (pos > _visElements) {
				_cssTop =  self.display_height - (pos * self.element_height);
				_visElements += 1;
			}
			
		}
		
		_animate();
	};
	
	// --------------------------------------------------------------------------------------
	self._slideUp = function (pos) {
		_cssTop = parseInt(self.slider_element.css('top'));	// get current postion of the promotions slider
		_visElements = self.max_elements_visble;

		// calculate how may promotions are visible or have been visible on downward slide
		if (_cssTop != 0) { _visElements -= Math.abs(_cssTop) / self.element_height; }
		
		//console.log('visElements', _visElements);
		
		// if total promotions less visible promotions is greater than or equal to maximum slider shift.
		if ((_noElements - _visElements) >= self.max_elements_shift) {
			//console.log('move up two');
			_cssTop = _cssTop + (self.element_height * self.max_elements_shift);
			_visElements += self.max_elements_shift;
		} else {
			//console.log('move up one');
			_cssTop = _cssTop + (self.element_height * (_noElements - _visElements));
			_visElements += (_noElements - _visElements);						
		}
		
		if (_cssTop <= 0) {
			_animate();
		}
	};	
	
	// --------------------------------------------------------------------------------------
	var _animate = function() {
	
		self.arrow_up.unbind('click');
		self.arrow_down.unbind('click');
	
		// animate slide down.
		self.slider_element.animate({top: _cssTop }, "slow", "swing", function() {
		
			// display up arrow
			if (_cssTop < 0) {
				_arrowEnable(self.arrow_up.find('img'));								
			} else if (_cssTop == 0) {
				_arrowDisable(self.arrow_up.find('img'));
			}

			// if no further promotions hide down arrow					
			if (_visElements == _noElements ) { 
				_arrowDisable(self.arrow_down.find('img'));
			} else { 
				_arrowEnable(self.arrow_down.find('img'));
			}
			
			self.arrow_up.bind('click', function(e) {
				e.preventDefault();
				self._slideUp();
			});
			self.arrow_down.bind('click', function(e) {
				e.preventDefault();
				self._slideDown();
			});
		});
	};	
	
	// --| START: Main |---------------------------------------------------------------------
	
	_noElements = self.slider_element.find("li").length; // calc number elements
	
	_sliderHeight = self.slider_element.height();
	
	if (_sliderHeight > self.display_height) { 
		//self.arrow_down.addClass('active'); 
		//self.arrow_down.removeClass('disabled'); 
		_arrowEnable(self.arrow_down.find('img'));
	}
	
	// arrow down click
	self.arrow_down.click(function(e) {
	
		e.preventDefault();
	
		if (!$(this).hasClass('disabled')) {
			self._slideDown();
		}
		return false;
	});
	
	// arrow up click
	self.arrow_up.click(function(e) {
	
		e.preventDefault();
	
		if (!$(this).hasClass('disabled')) {
			self._slideUp();
		}
		return false;
	});
	
	self.arrow.mouseover(function() { 
		_arrowMouseover(this);
	}).mouseout(function() {
		_arrowMouseout(this);
	});
	
	// --| END: Main |---------------------------------------------------------------------
	
};