/**
 * jQuery Image Scroller w/ Lightbox
 * Copyright (c) 2010 Allan Ma (http://codecanyon.net/user/webtako)
 * Version: 1.1 (08/10/2010)
 */
;(function($) {
	$.fn.wtScroller = function(params) {		
		var TOP = "top";
		var BOTTOM = "bottom";
		var LEFT = "left";
		var RIGHT = "right";
		var OUTSIDE = "outside";
		var INSIDE = "inside";
		var SLIDE_OPACITY = 0.9;		
		var BUTTON_OPACITY = 0.7;
		var OVERLAY_OPACITY = 0.85;
		var SCROLL_SPEED = 1000;
		var DEFAULT_TRANSPEED = 500;
		var ROLLOVER_SPEED = "normal";
		var DEFAULT_DELAY = 5000;
		var DBUTTON_WIDTH = 14;
		var LIGHTBOX_SIZE = 150;
		var MSIE = (jQuery.browser.msie) ? true : false;
		var LIGHTBOX_PATH = "include/gallery/assets/lightbox/";
		
		//Lightbox
		function Lightbox(scroller, opts) {
			var delay = opts.delay > 0 ? opts.delay : DEFAULT_DELAY;
			var enableRotation = opts.rotate;
			var descAlign = opts.caption_align != undefined ? opts.caption_align.toLowerCase() : BOTTOM;
			var displayDesc = opts.display_caption;
			var tranSpeed = opts.transition_speed > 0 ? opts.transition_speed : DEFAULT_TRANSPEED;
			var circular = opts.circular != undefined ? opts.circular : true;
			
			var $overlay;
			var $lightbox;
			var $mainImg;
			var $desc;
			var $preloader;
			var $cpanel;
			var $playBtn;
			var $textBtn;
			var $info;
			var $innerBox;
			var $slide;
			var $backPanel;
			var $fwdPanel;
			var $backBtn;
			var $fwdBtn;
			
			var currIndex;		
			var numItems;
			var cpHeight;
			var hBound;
			var vBound;
			var descVisible = true;
			var rotateOn = false;
			var timerId = null;			
			var winWidth;
			var winHeight;
			var msie6 = false;
			var visible = false;
			
			//init light box
			var init = function() {
				currIndex = 0;
				numItems = scroller.getNumSlides();
				
				//init components
				initLightbox();				
				$overlay = $("<div id='overlay'></div>");				
				$overlay.click(closeLightbox);
				$("body").append($overlay).append($lightbox);
				
				msie6Check();
				
				var padding = (($lightbox.outerWidth() - $lightbox.width()))/2;
				var margin = ($lightbox.outerWidth(true) - $lightbox.outerWidth())/2;
				cpHeight = 30;
				hBound = (2 * (padding + margin));
				vBound = (2 * margin) + padding + cpHeight;
			}
						
			//init lightbox
			var initLightbox = function() {
				var $outerBox = $("<div class='outer'></div>");
				$lightbox =		$("<div id='lightbox'></div>");
				$innerBox = 	$("<div class='inner'></div>");
				$desc =			$("<div class='desc'></div>");
				$mainImg = 		$("<img id='main-img' src='assets/spacer.png'/>");				
				$preloader = 	$("<div class='preloader'></div>");
				$cpanel = 		$("<div class='cpanel'></div>");				
								
				$innerBox.append($preloader).append($mainImg);
				initArrowButtons();
				if (displayDesc) {					
					$innerBox.append($desc);
				}
				
				$outerBox.append($innerBox).append($cpanel);				
				$lightbox.append($outerBox);
				
				initCPanel();
			}
			
			//init directional buttons
			var initArrowButtons = function() {
				//init back button
				$backBtn = $("<img src='" + LIGHTBOX_PATH + "prev.png' id='back-btn'/>");								
				$backPanel = $("<div class='btn-panel'></div>");
				$backPanel.append($backBtn);			
				$innerBox.append($backPanel);
				
				//init forward button
				$fwdBtn = $("<img src='" + LIGHTBOX_PATH + "next.png' id='fwd-btn'/>");				
				$fwdPanel =  $("<div class='btn-panel'></div>");	
				$fwdPanel.append($fwdBtn);		
				$innerBox.append($fwdPanel);										
			}
			
			//init control panel
			var initCPanel = function() {
				if (enableRotation) {
					$playBtn = $("<img id='play-btn'/>");
				
					if (rotateOn) {
						$playBtn.attr("src", LIGHTBOX_PATH + "pause.png");
					}
					else {
						$playBtn.attr("src", LIGHTBOX_PATH + "play.png");
					}
					$playBtn.css({opacity:BUTTON_OPACITY, "float":"left"}).hover(buttonOver, buttonOut);
					$cpanel.append($playBtn)
				}
				
				$info = $("<span id='info'></span>");
				
				var $closeBtn = $("<img src='" + LIGHTBOX_PATH + "close.png' id='close-btn'/>");
				$closeBtn.css({opacity:BUTTON_OPACITY, "float":"right"}).hover(buttonOver, buttonOut);				
				
				$cpanel.append($info).append($closeBtn);
					   
				if (displayDesc) {
					$textBtn = $("<img src='" + LIGHTBOX_PATH + "info.png' id='txt-btn'/>");
					$textBtn.css({opacity:BUTTON_OPACITY, "float":"right"}).hover(buttonOver, buttonOut);		
					$cpanel.append($textBtn);
				}
			}
			
			//on click display
			this.display = function(index) {
				currIndex = index;
				visible = true;
				
				removeSelects();
				$(window).unbind("resize", winResize).bind("resize", winResize);
				$(document).unbind("keyup", keyClose).bind("keyup", keyClose);
																   
				$lightbox.css({width:LIGHTBOX_SIZE, height:LIGHTBOX_SIZE,
							   left: Math.round(($(window).width() - LIGHTBOX_SIZE)/2),
							   top:  Math.round(($(window).height() - LIGHTBOX_SIZE)/2)});  
						 				
				$overlay.css({width:$(document).width(), height:$(document).height()})
						.stop(true).fadeTo(tranSpeed, OVERLAY_OPACITY);
									
				loadContent(currIndex);		
			}
			
			//close lightbox 
			var closeLightbox = function() {
				stopTimer();
				visible = false;				

				addSelects();
				$(window).unbind();
				$(document).unbind();
				
				disableCtrl();
				$desc.hide();
				$mainImg.stop(true);
				$lightbox.stop(true).hide();
				$overlay.stop(true).fadeOut(tranSpeed);		
									
				scroller.onFocus();
			}
			
			//load content
			var loadContent = function(i) {					
				$preloader.hide();
				$slide = $(scroller.getSlideAt(i));
				
				disableCtrl();
				$desc.css({display:"none"});
				$mainImg.stop(true).css({opacity:0});

				var imgSrc = $slide.find(">a:first").attr("href");
				var newImg = new Image();
				$(newImg).attr("src", imgSrc);		
				
				if (newImg.complete) {
					if (newImg.width > 0 && newImg.height > 0) {
						displayContent(newImg);
					}
					else {
						displayEmpty();
					}
				}
				else {					
					$preloader.show();
					$(newImg).load(
						function() {
							$preloader.hide();	
							displayContent(newImg);
						}
					).error(
						function() {	
							$preloader.hide();
							displayEmpty();
						}
					);
				}
			}
			
			//display content
			var displayContent = function(img) {
				if (visible) {
					resizeImg(img);											
					var imgWidth = img.width;
					var imgHeight = img.height;
					var l = Math.round(($(window).width() - (imgWidth + hBound))/2);
					var t = Math.round(($(window).height() - (imgHeight + vBound))/2);
					$lightbox.stop(true)
					         .animate({width:imgWidth, height:(imgHeight + cpHeight), left:l, top:t}, 
								tranSpeed, 
							function() {
								if (MSIE) { this.style.removeAttribute('filter'); }
								
								$innerBox.height(imgHeight);
								enableCtrl();																
								$info.html((currIndex + 1) + "/" + numItems);							
								$cpanel.css({top:imgHeight, display:"block"});
								$mainImg.css({width:imgWidth, height:imgHeight}).attr("src", img.src)
									    .animate({opacity:1}, tranSpeed, 
											function() {
												if (MSIE) { this.style.removeAttribute('filter'); }
												startTimer();
										 });
								showDesc();		
							}
					);
				}
			}
			
			//display empty content
			var displayEmpty = function() {
				if (visible) {
					var outerWidth = LIGHTBOX_SIZE + hBound;
					var outerHeight = LIGHTBOX_SIZE + vBound; 								
					var l = Math.round(($(window).width() - outerWidth)/2);
					var t = Math.round(($(window).height() - outerHeight)/2);
					$lightbox.stop(true)
							 .animate({width:LIGHTBOX_SIZE, height:LIGHTBOX_SIZE, left:l, top:t}, 
								tranSpeed, 
							function() {		
								$innerBox.height(LIGHTBOX_SIZE);
								$preloader.show();
							}
					);
				}
			}
			
			//resize image
			var resizeImg = function(img) {
				var ratio;
				var maxWidth  = $(window).width() - hBound;
				var maxHeight = $(window).height() - vBound;
				
				if (img.width > maxWidth) {
					ratio = img.height/img.width;
					img.width = maxWidth;
					img.height = (ratio * maxWidth);
				}
				
				if (img.height > maxHeight) {
					ratio = img.width/img.height;
					img.width = (ratio * maxHeight);
					img.height = maxHeight;
				}
			}
			
			//enable control panel
			var enableCtrl = function() {
				$(document).unbind("keyup", keyCtrl).bind("keyup", keyCtrl);
				$cpanel.unbind("click", cpanelClick).bind("click", cpanelClick);
				
				var backWidth = Math.round($innerBox.width()/2);
				var fwdWidth =  $innerBox.width() - backWidth;
			
				//enable back panel
				$innerBox.append($backPanel);
				$backPanel.width(backWidth).show();
				$backBtn.css({left:-$backBtn.width(), top:($backPanel.height() - $backBtn.height())/2});				
				if	(circular || currIndex > 0) {
					$backPanel.unbind().bind("click", prev).hover(displayBackButton, hideBackButton).css({cursor:"pointer"});	
				}
				else { 
					$backPanel.unbind().css({cursor:"default"});
				}
			
				//enable fwd panel
				$innerBox.append($fwdPanel);
				$fwdPanel.width(fwdWidth).show();
				$fwdBtn.css({right:-$fwdBtn.width(),  top:($fwdPanel.height() - $fwdBtn.height())/2});
				if (circular || currIndex < (numItems - 1)) {
					$fwdPanel.unbind().bind("click", next).hover(displayFwdButton, hideFwdButton).css({cursor:"pointer"});	   
				}
				else {
					$fwdPanel.unbind().css({cursor:"default"});
				}
			}

			//disable control panel
			var disableCtrl = function() {
				$(document).unbind("keyup", keyCtrl);
				$cpanel.unbind("click", cpanelClick);
		
				$backPanel.hide();	
				$innerBox.remove($backPanel);
				$fwdPanel.hide();			
				$innerBox.remove($fwdPanel);
				$cpanel.css({display:"none"});
			}
			
			//control panel click handler
			var cpanelClick = function(e) {
				var targetId = $(e.target).attr("id");
				if (targetId == "play-btn") {
					togglePlay();
				}
				else if (targetId == "txt-btn") {
					toggleDesc();
				}
				else if (targetId == "close-btn") {
					closeLightbox();
				}
			}
			
			//play / pause
			var togglePlay = function() {
				rotateOn = !rotateOn;
				if (rotateOn) {
					$playBtn.attr("src", LIGHTBOX_PATH + "pause.png");
					startTimer();
				}
				else {
					$playBtn.attr("src", LIGHTBOX_PATH + "play.png");
					stopTimer();
				}
			}
		
			//on previous image click
			var prev = function(e) {
				stopTimer();
				if (currIndex > 0) {
					currIndex = currIndex - 1;
				}
				else {
					if (circular) {
						currIndex = numItems - 1;
					}
					else {
						return;
					}
				}				
				loadContent(currIndex);
			}
			
			//on next image click
			var next = function(e) {
				stopTimer();
				if (currIndex < (numItems - 1)) {
					currIndex = currIndex + 1;
				}
				else {
					if (circular) {
						currIndex = 0;
					}
					else {
						return;
					}
				}				
				loadContent(currIndex);
			}

			//rotate next image
			var rotateNext = function() {
				stopTimer();
				if (currIndex < (numItems - 1)) {
					currIndex = currIndex + 1;
				}
				else {
					currIndex = 0;
				}				
				loadContent(currIndex);
			}
			
			//toggle description
			var toggleDesc = function() {
				descVisible = !descVisible;
				
				if (descVisible && $desc.html() != "") {
					var topVal = (descAlign == TOP) ? 0 : $mainImg.height() - $desc.outerHeight();
					$desc.animate({top:topVal}, tranSpeed);	
				}
				else {
					var topVal = (descAlign == TOP) ? -$desc.outerHeight() : $mainImg.height();
					$desc.stop(true).animate({top:topVal}, tranSpeed);		
				}
			}
			
			//show description
			var showDesc = function() {
				if (displayDesc) {			
					$desc.css({width:$mainImg.width() - ($desc.outerWidth() - $desc.width())})
						 .html($slide.find("p:first").html());
					
					var startVal, endVal;
					if (descAlign == TOP) {
						startVal = -$desc.outerHeight();
						endVal = 0;
					}
					else {
						startVal = $mainImg.height();
						endVal = $mainImg.height() - $desc.outerHeight();
					}	
					
					$desc.css({top:startVal}).show();
					if (displayDesc && $desc.html() != "") {
						$textBtn.show();
						if (descVisible) {				
							$desc.animate({top:endVal}, tranSpeed);
						}
					}
					else {
						$textBtn.hide();
					}
				}
			}
			
			var displayBackButton = function() {
				$backBtn.stop().animate({left:0}, ROLLOVER_SPEED);
			}
			
			var displayFwdButton = function() {			
				$fwdBtn.stop().animate({right:0}, ROLLOVER_SPEED);
			}
			
			var hideBackButton = function() {
				$backBtn.stop().animate({left:-$backBtn.width()}, ROLLOVER_SPEED);
			}
			
			var hideFwdButton = function() {
				$fwdBtn.stop().animate({right:-$fwdBtn.width()}, ROLLOVER_SPEED);
			}
			
			//on button over
			var buttonOver = function() {
				$(this).animate({opacity:1}, "fast");
			}

			//on button out
			var buttonOut = function() {
				$(this).stop(true).animate({opacity:BUTTON_OPACITY}, "fast");
			}
			
			//on window resize
			var winResize = function(e) {
				if(winHeight != document.documentElement.clientHeight ||
				   	winWidth != document.documentElement.clientWidth) {
					$overlay.css({width:$(document).width(), height:$(document).height()});
					$lightbox.css({left: Math.round(($(window).width() - $lightbox.outerWidth(true))/2),
								   top:  Math.round(($(window).height() - $lightbox.outerHeight(true))/2)});
				}
				winWidth =  document.documentElement.clientWidth;
				winHeight = document.documentElement.clientHeight;
			}
			
			//on key press
			var keyCtrl = function(e) {
				switch(e.keyCode) {
					case 37:
						prev();
						break;
					case 39:
						next();
						break;
					case 32:
						togglePlay();
						break;
				}
			}
			
			//on key press close
			var keyClose = function(e) {
				switch(e.keyCode) {
					case 27: 
					case 67: 
					case 88:
						closeLightbox();
				}
			}
			
			//check for msie 6
			var msie6Check = function() {
				if (MSIE) {
					if (parseInt(jQuery.browser.version) < 7) {
						$overlay.css({position: "absolute"});
						$lightbox.css({position: "absolute"});	
						msie6 = true;
					}
  				}
			}
			
			var removeSelects = function() {
				if (msie6) {
					$("body").find("select").css("visibility", "hidden");
				}
			}
			
			var addSelects = function() {
				if (msie6) {
					$("body").find("select").css("visibility", "visible");
				}
			}
			
			//start timer
			var startTimer = function() {
				if (enableRotation && rotateOn && timerId == null) {
					timerId = setTimeout(rotateNext, delay);
				}
			}
			
			//stop timer
			var stopTimer = function() {
				clearTimeout(timerId);
				timerId = null;
			}
			
			init();
		}
		
		//Scroller
		function Scroller($obj, opts) {
			var numDisplay = opts.num_display > 0 ? opts.num_display : 1;
			var slideWidth = opts.slide_width;
			var slideHeight = opts.slide_height;
			var slideMargin = opts.slide_margin;
			var margin = opts.margin;
			var bgColor = opts.background_color;
			var winColor = opts.window_color;	
			var autoRotate = opts.auto_scroll;
			var delay = opts.delay > 0 ? opts.delay : DEFAULT_DELAY;
			var tranSpeed = opts.scroll_speed > 0 ? opts.scroll_speed : SCROLL_SPEED;
			var easing = opts.easing;
			var enableLightbox = opts.enable_lightbox;
			var displayInfo = opts.display_info;
			var compactButtons = opts.compact_buttons;
			var displayButtons = opts.display_buttons;
			var displayScrollbar = opts.display_scrollbar;
			var displayCaption = opts.display_caption;
			var mouseoverCaption = opts.mouseover_caption;
			var captionPos = opts.caption_position.toLowerCase();
			var captionAlign = opts.caption_align.toLowerCase();
			var moveBy1 = opts.move_one;
			var circular = opts.circular;
			
			var $scroller =   $(".wt-scroller", $obj);
			var $slidePanel = $scroller.find(".slides");
			var $slideList =  $slidePanel.find("ul");
			var $slides =	  $slideList.find(">li");
			var $prevBtn =    $scroller.find(".prev-btn");			
			var $nextBtn =    $scroller.find(".next-btn");
			var $scrollbar =  $scroller.find(".scroll-bar");
			var $thumb =      $scrollbar.find(".thumb");
			var $info =  	  $scroller.find(".info-panel");
			
			var lightbox;
			var numSlides;
			var unitSize;
			var backSlots;
			var fwdSlots;
			var numSlots;	
			var moveRatio;
			var range;
			var scrollRange;
			var pos;	
			var rotate;
			var timerId = null;			
			var lightboxOn;			
			var xOffset;
			var yOffset;
			
			this.init = function() {
				rotate = autoRotate;
				numSlides = $slides.size();
				numSlots = numSlides - numDisplay;
				backSlots = 0;
				fwdSlots = numSlots;
				pos = 0;
				
				initSlides();
				initButtons();
				initScrollbar();
				initInfoPanel();
				
				scrollRange = $scrollbar.width() - $thumb.width();
				moveRatio = range/scrollRange;		
				
				$scroller.css({width:$slidePanel.width() + $prevBtn.outerWidth() + $nextBtn.outerWidth(),
					height:$slides.outerHeight() + $scrollbar.outerHeight(true) + $info.outerHeight(true),
							 "background-color":bgColor}).hover(scrollerOver, scrollerOut);
				
				if (enableLightbox) {
					lightbox = new Lightbox(this, opts.lightbox);
				}
				
				updateInfo();
				this.onFocus();
			}
			
			//get slide at
			this.getSlideAt = function(i) {
				return $slides[i];
			}
			
			//get number slides
			this.getNumSlides = function() {
				return numSlides;
			}
			
			//init slides
			var initSlides = function() {		
				initCaptions();
				
				var $images = $slides.find("img:first");					
				$images.each(
					function(n) {
						if (this.complete && this.width > 0) {
							processImg(this);
						}
						else {
							$(this).load(processLoadedImg);				
						}
					}
				);
				
				var tWidth = $scroller.data("total").width;
				var tHeight = $scroller.data("total").height;
				
				//process slide container
				$slides.css({width:tWidth, height:tHeight,
							"margin-right":slideMargin, "background-color":winColor})
						.hover(slideOver, slideOut)
					.each(
						function(n) {
							var slideLink = $(this).find(">a:first").attr("href");
							if (enableLightbox) {
								$(this).click(
									function() {
										onBlur();			
										lightbox.display(n);								
										return false;
									});
							}

							if (slideLink != undefined && slideLink != "") {
								$(this).css({cursor:"pointer"});
							}
							else {
								$(this).unbind("click");
							}
							
							if (slideMargin == 0 && n < (numSlides - 1)) {
								$(this).css({"border-right-width":0});
							}
						}
				);
				
				var slidePanelWidth;
				var slidePanelHeight = $slides.outerHeight();
				if (slideMargin == 0) {
					var borderSize = ($slides.outerHeight() - $slides.height())/2;
					slidePanelWidth = (numDisplay * $slides.width()) + ((numDisplay + 1) * borderSize);
					$slidePanel.css({width:slidePanelWidth, height:slidePanelHeight});
					unitSize = $slides.width() + borderSize;
					$slideList.css({width:(numSlides * unitSize) + borderSize, 
									height:slidePanelHeight});				  					
					range = $slideList.width() - $slidePanel.width();				  
				}
				else {
					slidePanelWidth = (numDisplay * $slides.outerWidth()) + ((numDisplay - 1) * slideMargin);					
					$slidePanel.css({width:slidePanelWidth, height:slidePanelHeight});
					unitSize = $slides.outerWidth(true);
					$slideList.css({width:(numSlides * unitSize), 
									height:slidePanelHeight});				
					range = (($slideList.width() - slideMargin) - $slidePanel.width());				  
				}
			}
			
			//init captions
			var initCaptions = function() {
				var $captions = $slides.find("p:first");
				$captions.show();
				var totalWidth = slideWidth;
				var totalHeight = slideHeight;
				xOffset = 0;
				yOffset = 0;
				
				if (!displayCaption) {
					$captions.css({display:"none", width:0, height:0});
				}
				else {
					var captionWidth = opts.caption_width;
					var captionHeight = opts.caption_height;				
					
					$captions.click(stopPropagation);
					
					//set caption size
					var pad = $captions.outerWidth() - $captions.width();				
					if (captionAlign == LEFT || captionAlign == RIGHT) {
						$captions.css({width:captionWidth - pad, height:slideHeight - pad});
					}
					else {
						$captions.css({width:slideWidth - pad, height:captionHeight - pad});					
					}
					
					//set caption position
					if (captionPos == OUTSIDE) {
						$captions.removeClass("inside");
						if (captionAlign == TOP) {						
							$captions.css({top:0, left:0});
							yOffset = captionHeight;
							totalHeight += captionHeight;
						}
						else if (captionAlign == BOTTOM) {
							$captions.css({top:slideHeight, left:0});
							totalHeight += captionHeight;
						}
						else if (captionAlign == LEFT) {		
							$captions.css({top:0, left:0});
							xOffset = captionWidth;
							totalWidth += captionWidth;
						}
						else {				
							$captions.css({top:0, left:slideWidth});
							totalWidth += captionWidth;
						}
					}
					else {
						$captions.addClass("inside");
						var lVal = 0;
						var tVal = 0;
						if (captionAlign == TOP) {
							tVal = mouseoverCaption ? -$captions.outerHeight() : 0;
						}
						else if (captionAlign == BOTTOM) {
							tVal = mouseoverCaption ? slideHeight : slideHeight - $captions.outerHeight();
						}
						else if (captionAlign == LEFT) {
							lVal = mouseoverCaption ? -$captions.outerWidth() : 0;
						}
						else {
							lVal = mouseoverCaption ? slideWidth : slideWidth - $captions.outerWidth();
						}					
						$captions.css({top:tVal, left:lVal});
					}
				}
				
				$scroller.data("total", {width: Number(totalWidth), height: Number(totalHeight)});
			}
			
			//init buttons
			var initButtons = function() {							
				if (displayButtons) {		
					var btnWidth = DBUTTON_WIDTH + (2 * margin);
					var btnHeight = $slides.outerHeight();
					$prevBtn.css({width:btnWidth, height:btnHeight})
							.click(moveBack).mousedown(onMouseDown);
					$nextBtn.css({width:btnWidth, height:btnHeight})
							.click(moveFwd).mousedown(onMouseDown);
					$scroller.css({"padding-left":0, "padding-right":0});
				}
				else {
					$prevBtn.css({width:0, height:0}).hide();
					$nextBtn.css({width:0, height:0}).hide();
					$scroller.css({"padding-left":margin, "padding-right":margin});
				}
			}
			
			//init scrollbar
			var initScrollbar = function() {
				if (displayScrollbar) {
					var $lowerPanel = $scroller.find(".lower-panel");
					$lowerPanel.show();	  
					$lowerPanel.css({width:$slidePanel.outerWidth()});
					$scrollbar.css({width:$lowerPanel.width(), 
								"margin-top":margin, "margin-bottom":margin,
								"margin-left":$prevBtn.outerWidth(), "margin-right":$nextBtn.outerWidth()})
							  .click(trackClick).mousedown(onMouseDown);
					
					var thumbSize = opts.thumb_size;
					if (thumbSize <= 0 || thumbSize >= $scrollbar.width()) {
						thumbSize = Math.floor((numDisplay/numSlides) * $scrollbar.width());
					}
					
					$thumb.css({width: thumbSize})
						  .draggable({containment: "parent"})
						  .bind("drag", thumbDrag).bind("dragstop", thumbDragStop)
						  .click(stopPropagation).mousedown(onMouseDown);
					$scroller.css("padding-bottom", 0);
				}
				else {
					$scrollbar.css({width:0, height:0, margin:0}).hide();
					$scroller.find(".lower-panel").css({width:0, height:0, margin:0}).hide();
					$scroller.css("padding-bottom", margin);
				}
			}
			
			//init info panel
			var initInfoPanel = function() {
				if (displayInfo) {
					$info.css({width:$slidePanel.outerWidth(),
								"margin-left":$prevBtn.outerWidth(), 
								"margin-right":$nextBtn.outerWidth()});	
					$scroller.css("padding-top", 0);
				}
				else {
					$info.css({width:0, height:0, margin:0, "line-height":0}).hide();
					$scroller.css("padding-top", margin);
				}
			}
			
			//update info
			var updateInfo = function() {
				var begIndex = Math.abs(pos/unitSize);
				var endIndex = begIndex + numDisplay;
				$info.html((begIndex + 1) + " - " + endIndex + " of " + numSlides);
				
				if	(circular || begIndex > 0) {
					$prevBtn.css({opacity:1}).css({cursor:"pointer"});	
				}
				else { 
					$prevBtn.css({opacity:BUTTON_OPACITY}).css({cursor:"default"});
				}
				
				if (circular || endIndex < numSlides) {
					$nextBtn.css({opacity:1}).css({cursor:"pointer"});	
				}
				else {
					$nextBtn.css({opacity:BUTTON_OPACITY}).css({cursor:"default"});	
				}
			}
			
			//on track click
			var trackClick = function(e) {
				var pct = (e.pageX - $scrollbar.offset().left)/$scrollbar.width();
				autoStop(pct);
			}
			
			//on thumb drag
			var thumbDrag = function() {
				$slideList.css({left: Math.round(-$thumb.position().left * moveRatio)});
			}
			
			//on thumb stop
			var thumbDragStop = function() {
				autoStop($thumb.position().left/scrollRange);						
			}
			
			//auto stop
			var autoStop = function(pct) {
				var move;
				var newPos = pct * range;
				
				if (newPos > Math.abs(pos)) {
					move = Math.ceil(newPos/unitSize);			
				}
				else if (newPos < Math.abs(pos)) {
					move = Math.floor(newPos/unitSize);
				}
				else {
					return;
				}
			
				//calculate new position
				var prevPos = pos;			
				pos = -move * unitSize;  		
					
				var slots = move + (prevPos/unitSize);			
				backSlots += slots;
				fwdSlots -= slots;
				
				$slideList.stop(true, true).animate({left:pos}, tranSpeed, easing, startTimer);
				moveThumbBy(pos);
			}
			
			//move slides back
			var moveBack = function() {
				stopTimer();
				
				if (fwdSlots < numSlots) {
					var move = (moveBy1) ? 1: numSlots - fwdSlots;
					if (move >= numDisplay) {
						move = numDisplay;
					}
					
					fwdSlots += move;
					backSlots -= move;
					pos += move * unitSize;
				}
				else if (circular) {
					fwdSlots = 0;
					backSlots = numSlots;
					pos = -numSlots * unitSize;
				}
				
				$slideList.stop(true, true).animate({left: pos}, tranSpeed, easing, startTimer);
				moveThumbBy(pos);
			}
			
			//move slides forward
			var moveFwd = function() {
				stopTimer();

				if (backSlots < numSlots) {
					var move = (moveBy1) ? 1 : numSlots - backSlots;
					if (move >= numDisplay) {
						move = numDisplay;
					}

					backSlots += move;
					fwdSlots -= move;		
					pos -= move * unitSize;	
				}
				else if (circular) {
					backSlots = 0;
					fwdSlots = numSlots;		
					pos = 0;		
				}
				
				$slideList.stop(true, true).animate({left: pos}, tranSpeed, easing, startTimer);
				moveThumbBy(pos);
			}

			//rotate slides forward
			var rotateFwd = function() {
				stopTimer();

				if (backSlots < numSlots) {
					var move = (moveBy1) ? 1 : numSlots - backSlots;
					if (move >= numDisplay) {
						move = numDisplay;
					}

					backSlots += move;
					fwdSlots -= move;		
					pos -= move * unitSize;	
				}
				else {
					backSlots = 0;
					fwdSlots = numSlots;		
					pos = 0;		
				}
				
				$slideList.stop(true, true).animate({left: pos}, tranSpeed, easing, startTimer);
				moveThumbBy(pos);
			}
			
			//move thumb by
			var moveThumbBy = function(lPos) {
				var move = Math.round(Math.abs(lPos) * (1/moveRatio));				
				$thumb.stop(true, true).animate({left:move}, tranSpeed, easing);
				updateInfo();
			}
			
			//process loaded image size & position
			var processLoadedImg = function() {
				processImg(this);
			}
			
			//process image size & position
			var processImg = function(newImg) {
				var ratio;
				if ($(newImg).outerWidth() > slideWidth) {							
					ratio = $(newImg).outerHeight()/$(newImg).outerWidth();
					$(newImg).css({width:slideWidth, height:(ratio * slideWidth)});
				}
				
				if ($(newImg).outerHeight() > slideHeight) {
					ratio = $(newImg).outerWidth()/$(newImg).outerHeight();
					$(newImg).css({width:(ratio * slideHeight), height: slideHeight});
				}
						
				$(newImg).css({left: xOffset + (slideWidth - $(newImg).outerWidth())/2,
							   top: yOffset +  (slideHeight - $(newImg).outerHeight())/2}).show();
				
			}
			
			//on scroller blur
			var onBlur = function() {
				lightboxOn = true;
				stopTimer();
				$(document).unbind();
			}
			
			//on scroller focus
			this.onFocus = function() {
				lightboxOn = false;
				startTimer();
				$(document).unbind().bind("keyup", onKeyPress);
			}
			
			//on mouse down 
			var onMouseDown = function() {
				return false;
			}
			
			//on slide over
			var slideOver = function() {
				$(this).find("img:first").animate({opacity:SLIDE_OPACITY}, "fast");
				if (mouseoverCaption && captionPos == INSIDE) {
					var $p = $(this).find("p:first"); 
					
					if (captionAlign == BOTTOM) {						
						$p.animate({top:(slideHeight - $p.outerHeight())}, ROLLOVER_SPEED);
					}
					else if (captionAlign == TOP) {
						$p.animate({top:0}, ROLLOVER_SPEED);
					}
					else if (captionAlign == RIGHT) {
						$p.animate({left:slideWidth - $p.outerWidth()}, ROLLOVER_SPEED);
					}
					else {
						$p.animate({left:0}, ROLLOVER_SPEED);
					}
				}
			}
			
			//on slide out
			var slideOut = function() {
				$(this).find("img:first").stop(true).animate({opacity:1}, "fast", 
								function() {
									if (MSIE) {
										this.style.removeAttribute('filter');						
									}
								});
				if (mouseoverCaption && captionPos == INSIDE) {
					var $p = $(this).find("p:first"); 
					
					if (captionAlign == BOTTOM) {						
						$p.stop(true).animate({top:slideHeight}, ROLLOVER_SPEED);
					}
					else if (captionAlign == TOP) {
						$p.stop(true).animate({top:-$p.outerHeight()}, ROLLOVER_SPEED);
					}
					else if (captionAlign == RIGHT) {
						$p.stop(true).animate({left:slideWidth}, ROLLOVER_SPEED);
					}
					else {
						$p.stop(true).animate({left:-$p.outerWidth()}, ROLLOVER_SPEED);
					}

				}
			}
			
			//on scroller over
			var scrollerOver = function() {
				rotate = false;
				stopTimer();
			}
			
			//on scroller out
			var scrollerOut = function() {
				rotate = true;
				startTimer();
			}
			
			//on key press
			var onKeyPress = function(e) {
				switch(e.keyCode) {
					case 37:
						moveBack();
						break;
					case 39:
						moveFwd();
						break;
				}
			}

			//stop propagation
			var stopPropagation = function(e) {
				e.stopPropagation();
			}
			
			//start timer
			var startTimer = function() {
				if (autoRotate && rotate && 
					!lightboxOn && timerId == null) {
					timerId = setTimeout(rotateFwd, delay);
				}
			}
			
			//stop timer
			var stopTimer = function() {
				clearTimeout(timerId);
				timerId = null;
			}
		}
		
		var defaults = { 
			num_display:3,
			slide_width:300,
			slide_height:200,
			slide_margin:0,
			margin:8,
			thumb_size:0,
			background_color:"#333",			
			window_color:"#FFF",
			auto_scroll:true,
			delay:DEFAULT_DELAY,
			scroll_speed:SCROLL_SPEED,
			easing:"easeOutQuart",
			move_one:false,
			compact_buttons:true,
			display_info:true,
			display_buttons:true,			
			display_scrollbar:true,
			display_caption:true,
			mouseover_caption:false,
			caption_align:TOP,
			caption_position:INSIDE,
			caption_width:100,
			caption_height:35,
			enable_lightbox:true,
			circular:true,
			lightbox: {
				rotate:true,
				delay:DEFAULT_DELAY,
				display_caption:true,
				caption_align:BOTTOM,
				transition_speed:DEFAULT_TRANSPEED,
				circular:true
			}
		};
		
		var opts = $.extend({}, defaults, params);		

		return this.each(
			function() {
				var scroller = new Scroller($(this), opts);
				scroller.init();
			}
		);
	}
})(jQuery);
