(function($)
{

	virb.$.slider = {
		active : []
	};
			
	virb.$.fn.slider = function(settings)
	{
		virb.$(window).load(function()
        {
            virb.$.fn.slider.loaded(); 
        });
	
		return this.each(
			function()
			{
				virb.$.fn.slider.init(virb.$(this));
				virb.$.fn.slider.args.loadTimers = setInterval("virb.$.fn.slider.update()", 1000);
			}
		);
	};
	
	virb.$.fn.slider.args = {
		loaded: false
	};
	
	
	virb.$.fn.slider.init = function($scrollObj)
	{
		// Add wrapper
		$scrollObj.wrap(virb.$('<div></div>').attr({'className':'slider-container'}));
		
		this.objs                 = {};		
		this.objs.scroll          = $scrollObj.css({overflow: 'visible', left: 0});
		this.objs.sliderContainer = virb.$('.slider-container');
		
		// Calculate dimensions
		this.setDimensions();
		
		// Add scrollbars
		this.initScrollbars();
		
		this.attachEvents($scrollObj);
	};
	
	virb.$.fn.slider.setDimensions = function()
	{
		if (!this.dims)
		{
			this.dims = {};	
		}
		
		if (!this.objs)
		{
			return false;
		}                
		
		// Width of container
		this.dims.containerWidth = this.objs.sliderContainer.innerWidth();

		// Width of content
		if (this.objs.scroll.attr('tagName') != 'TABLE')
		{
			this.objs.scroll.css({overflow:"hidden"});	
		}
		
		this.dims.contentWidth = this.objs.scroll.attr('scrollWidth');

		this.objs.scroll.css({overflow:"visible"});
		
		if (virb.$.browser.msie && virb.$.browser.version.substr(0,1) < 8)
		{
			if (this.dims.contentWidth == this.dims.containerWidth && this.dims.containerWidth > virb.$(window).width())
			{
				this.objs.sliderContainer.css('width', virb.$(window).width());
			}
		}
		
		
		// Percent of content in view
		this.dims.percentInViewX = this.dims.containerWidth / this.dims.contentWidth;

		// Width of drag button
		this.dims.dragButtonWidth   = this.dims.containerWidth * this.dims.percentInViewX;
		this.dims.dragButtonPercent = this.dims.percentInViewX * 100;
		
		// window.console.log(this.dims);
	};
	
	virb.$.fn.slider.initScrollbars = function()
	{
		this.objs.sliderTrack = this.objs.sliderContainer.find('.slider-track:first');

		// Add horizontal scrollbars
		if (this.dims.percentInViewX < 0.99)
		{
			this.addScrollbar('horizontal');
			this.setScrollDimensions();
		}
		else
		{
			this.removeScrollbar('horizontal');
		}
	};
		
	virb.$.fn.slider.addScrollbar = function()
	{
		if (this.objs.sliderTrack.length <= 0)
		{
			this.objs.sliderContainer.append(
				virb.$('<div id="slider"></div>').attr({'className': 'slider-track'}).append(
					virb.$('<div></div>').attr({'className': 'slider-track-x'}).append(
						virb.$('<div id="handle"></div>').attr({'className': 'slider-drag'}).css({left: 0})
					).mousedown(function(event)
					{
						virb.$.fn.slider.startDrag(event);
						event.stopPropagation();
						return false;
					})
				)
			);
			
			this.objs.sliderTrack  = this.objs.sliderContainer.find('.slider-track');
			this.objs.sliderTrackX = this.objs.sliderContainer.find('.slider-track-x');
			this.objs.drag         = this.objs.sliderContainer.find('.slider-drag');
			
			if (virb.$('#customize_iframe').length > 0)
			{
				var iframeTop = virb.$('#customize_iframe').css('top').replace('px', '')*1;
				var iframeOffset = this.objs.sliderTrack.attr('offsetHeight');
				virb.$('#customize_iframe').css('top', iframeTop+iframeOffset);
			}
		}
	};
	
	virb.$.fn.slider.setScrollDimensions = function()
	{
		var dragCss = {width: this.dims.dragButtonPercent+'%', position: 'relative'};			
		this.objs.drag.css(dragCss);		
	};

	virb.$.fn.slider.removeScrollbar = function()
	{
		if (this.objs.sliderTrack.length > 0)
		{
			if (virb.$('#customize_iframe').length > 0)
			{
				var iframeTop = virb.$('#customize_iframe').css('top').replace('px', '')*1;
				var iframeOffset = this.objs.sliderTrack.attr('offsetHeight');
				virb.$('#customize_iframe').css('top', iframeTop-iframeOffset);				
			}
			
			this.objs.scroll.css({left: 0});
			this.objs.sliderTrack.remove();		
		}
	};
	
	virb.$.fn.slider.startDrag = function(event)
	{		
		$drag = this.objs.drag;
		
		var mouseX      = event.pageX;
		var mouseY      = event.pageY;
		var offsetLeft  = this.objs.drag.css('left').replace('px','')*1;
		var offsetTop   = this.objs.drag.css('top').replace('px','')*1;
		var maxLeft     = this.objs.sliderTrackX.width()-this.objs.drag.width();
		var maxBottom   = '';

		if (event.target != this.objs.drag.get(0))
		{
			var clickOffset = this.objs.sliderTrackX.offset();
			var offsetPercent = (event.pageX-clickOffset.left)/this.objs.sliderTrackX.width();
			$drag.css({left: maxLeft*offsetPercent+'px'});	
			virb.$.fn.slider.adjustScroll();
			
			offsetLeft  = maxLeft*offsetPercent;
		}
						
		virb.$(document).mousemove(function(event)
		{
			var dragLeft = offsetLeft-(mouseX-event.pageX);

			if (dragLeft < 0)
			{
				dragLeft = 0;
			}
			else if (dragLeft > maxLeft)
			{
				dragLeft = maxLeft;
			}
			
			virb.$.fn.slider.adjustScroll();
			$drag.css({left: dragLeft+'px'});	
			
		}).mouseup(function(event)
		{
			virb.$.fn.slider.stopDrag();
		});	
	};
	
	virb.$.fn.slider.scrollWheelX = function(deltaX)
	{
		if (this.objs && this.objs.drag)
		{
			var offsetLeft = this.objs.drag.css('left').replace('px','')*1;
			var maxLeft    = this.objs.sliderTrackX.width()-this.objs.drag.width();
			var dragLeft   = offsetLeft+deltaX;

			if (dragLeft < 0)
			{
				dragLeft = 0;
			}
			else if (dragLeft > maxLeft)
			{
				dragLeft = maxLeft;
			}

			virb.$.fn.slider.adjustScroll();
			this.objs.drag.css({left: dragLeft+'px'});		
		}		
	};
	
	virb.$.fn.slider.adjustScroll = function()
	{
		var dragLeft     = this.objs.drag.css('left').replace('px','')*1;
		var adjustOffset = dragLeft+this.objs.drag.width();

		if (adjustOffset > this.objs.sliderTrackX.width())
		{				
			dragLeft = this.objs.sliderTrackX.width() - this.objs.drag.width();
			this.objs.drag.css({left: dragLeft+'px'});
		}

		var scrollWidth = this.dims.contentWidth - this.dims.containerWidth;
		var maxLeft     = this.objs.sliderTrackX.width() - this.objs.drag.width();
		
		var scrollPercent = maxLeft/dragLeft;
		var scrollLeft    = -scrollWidth/scrollPercent;
		
		this.objs.scroll.css({left: scrollLeft+'px'});
	};
	
	
	virb.$.fn.slider.stopDrag = function()
	{
		virb.$(document).unbind('mousemove');
	};
	
	virb.$.fn.slider.update = function()
	{
		// window.console.log('update');
		// Calculate dimensions
		if (this.objs)
		{
			this.setDimensions();   
		}


		if (this.objs)
		{
			// Update scrollbars
			this.initScrollbars();
		}

		if (this.objs && this.objs.drag)
		{

			// Update scrollbar dimensions
			this.setScrollDimensions();

			// Add scrollbars
			this.adjustScroll();			
		}
	};
	
	virb.$.fn.slider.loaded = function()
	{
		// window.console.log('loaded');
		clearInterval(this.args.loadTimers);
		this.args.loadTimers = false;
		delete this.args.loadTimers;
		
		this.args.loaded = true;

		if (this.objs && this.objs.sliderContainer)
		{
			this.update();	
		}
	};
		
	virb.$.fn.slider.attachEvents = function($scrollObj)
	{
		virb.$(window).load(function()
		{
			virb.$.fn.slider.update($scrollObj);			
		});

		virb.$(window).resize(function()
		{
			virb.$.fn.slider.update($scrollObj);
		});
		
		// Scroll wheel, up/down/left/right		
		this.objs.sliderContainer.bind('mousewheel', function(event, delta, deltaX, deltaY)
		{
			if (deltaX != 0)
			{
				virb.$.fn.slider.scrollWheelX(deltaX);
			}
		});
		// Click/drag scroll track
		// Click/drag scroll button
	};

})(jQuery);
