/* malihu custom scrollbar plugin - http://manos.malihu.gr */
/* touch swipe integrated */
(function ($) {
$.fn.mCustomScrollbar = function (scrollType,animSpeed,easeType,bottomSpace,draggerDimType,mouseWheelSupport,scrollBtnsSupport,scrollBtnsSpeed){
	var id = $(this).attr("id");
	var $customScrollBox=$("#"+id+" .customScrollBox");
	var $customScrollBox_container=$("#"+id+" .customScrollBox .container");
	var $customScrollBox_content=$("#"+id+" .customScrollBox .content");
	var $dragger_container=$("#"+id+" .dragger_container");
	var $dragger=$("#"+id+" .dragger");
	var $scrollUpBtn=$("#"+id+" .scrollUpBtn");
	var $scrollDownBtn=$("#"+id+" .scrollDownBtn");
	var $customScrollBox_horWrapper=$("#"+id+" .customScrollBox .horWrapper");
	
	//get & store minimum dragger height & width (defined in css)
	if(!$customScrollBox.data("minDraggerHeight")){
		$customScrollBox.data("minDraggerHeight",$dragger.height());
	}
	if(!$customScrollBox.data("minDraggerWidth")){
		$customScrollBox.data("minDraggerWidth",$dragger.width());
	}
	
	//get & store original content height & width
	if(!$customScrollBox.data("contentHeight")){
		$customScrollBox.data("contentHeight",$customScrollBox_container.height());
	}
	if(!$customScrollBox.data("contentWidth")){
		$customScrollBox.data("contentWidth",$customScrollBox_container.width());
	}
	
	CustomScroller();
	
	function CustomScroller(reloadType){
		//horizontal scrolling ------------------------------
		if(scrollType=="horizontal"){
			var visibleWidth=$customScrollBox.width();
			//set content width automatically
			$customScrollBox_horWrapper.css("width",999999); //set a rediculously high width value ;)
			$customScrollBox.data("totalContent",$customScrollBox_container.width()); //get inline div width
			$customScrollBox_horWrapper.css("width",$customScrollBox.data("totalContent") + 1); //set back the proper content width value
			
			if($customScrollBox_container.width()>visibleWidth){ //enable scrollbar if content is long
				$dragger.css("display","block");
				if(reloadType!="resize" && $customScrollBox_container.width()!=$customScrollBox.data("contentWidth")){
					$dragger.css("left",0);
					$customScrollBox_container.css("left",0);
					$customScrollBox.data("contentWidth",$customScrollBox_container.width());
				}
				$dragger_container.css("display","block");
				$scrollDownBtn.css("display","inline-block");
				$scrollUpBtn.css("display","inline-block");
				var totalContent=$customScrollBox_content.width();
				var minDraggerWidth=$customScrollBox.data("minDraggerWidth");
				var draggerContainerWidth=$dragger_container.width();
		
				function AdjustDraggerWidth(){
					if(draggerDimType=="auto"){
						var adjDraggerWidth=Math.round(totalContent-((totalContent-visibleWidth)*1.3)); //adjust dragger width analogous to content
						if(adjDraggerWidth<=minDraggerWidth){ //minimum dragger width
							$dragger.css("width",minDraggerWidth+"px");
						} else if(adjDraggerWidth>=draggerContainerWidth){
							$dragger.css("width",draggerContainerWidth-10+"px");
						} else {
							$dragger.css("width",adjDraggerWidth+"px");
						}
					}
				}
				AdjustDraggerWidth();
		
				var targX=0;
				var draggerWidth=$dragger.width();
				$dragger.draggable({ 
					axis: "x", 
					containment: "parent", 
					drag: function(event, ui) {
						ScrollX();
					}, 
					stop: function(event, ui) {
						DraggerRelease();
					}
				});
				
				
				//enabling touch swipe - requires mobileChecker
				//Assign handlers to the simple direction handlers.
				if(mobileChecker.isMobile){
					function enableXDragger(){
						var thumbContainerWidth = $customScrollBox_container.width();
						var currentImg=0;
						var speed=500;
						var thumbs;
						var lastPos = 0;
						var isDragging = false;

						var swipeOptions=
						{
							triggerOnTouchEnd : true,	
							swipeStatus : swipeStatus,
							allowPageScroll:"vertical",
							threshold:0
						}
						
						$(function()
						{
							thumbs = $customScrollBox_container;
							thumbs.swipe( swipeOptions );
						});
					
							
						/**
						* Catch each phase of the swipe.
						* move : we drag the div.
						* cancel : we animate back to where we were
						* end : we animate to the next image
						*/			
						function swipeStatus(event, phase, direction, distance)
						{
							
							if( phase=="start" ){
								isDragging = true;
							}
							//If we are moving before swipe, and we are going L or R in X mode, or U or D in Y mode then drag.
							if( phase=="move" && (direction=="left" || direction=="right") )
							{
								var duration=0;
								if (direction == "left")
									scrollImages(-distance, duration);
								
								else if (direction == "right")
									scrollImages(distance, duration);
							}
							else if ( phase == "cancel")
							{
									scrollImages(lastPos, speed);
							}
							else if ( phase =="end" )
							{
								isDragging = false;
								if (thumbs.position().left > 0){
									scrollMaxLeft();
								}
								
								else if (thumbs.position().left < -(thumbs.width() - $customScrollBox.width())){
									scrollMaxRight();
								}
								
								else {
									lastPos = thumbs.position().left;
								}
							}
						}

						/**
						* Manuallt update the position of the imgs on drag
						*/
						function scrollMaxLeft(){
							thumbs.stop().animate({left: 0 + 'px'},speed, function(){
								lastPos = thumbs.position().left;
							});
							MoveDraggerX();
						}
		
						function scrollMaxRight(){
							thumbs.stop().animate({left: -(thumbContainerWidth - $customScrollBox.width()) + 'px'},speed, function(){
								lastPos = thumbs.position().left;
							});
							MoveDraggerX();
						}

						function scrollImages(distance, duration)
						{
							//inverse the number we set in the css
							var value = (distance<0 ? "" : "-") + Math.abs(distance).toString();
							thumbs.stop().animate({left:(Number(lastPos) + Number(distance)) + 'px'},duration);
							MoveDraggerX();
						}
					}
					enableXDragger();
				}

				$dragger_container.click(function(e) {
					var $this=$(this);
					var mouseCoord=(e.pageX - $this.offset().left);
					if(mouseCoord<$dragger.position().left || mouseCoord>($dragger.position().left+$dragger.width())){
						var targetPos=mouseCoord+$dragger.width();
						if(targetPos<$dragger_container.width()){
							$dragger.css("left",mouseCoord);
							ScrollX();
						} else {
							$dragger.css("left",$dragger_container.width()-$dragger.width());
							ScrollX();
						}
					}
				});

				//mousewheel
				$(function($) {
					if(mouseWheelSupport=="yes"){
						$customScrollBox.unbind("mousewheel");
						$customScrollBox.bind("mousewheel", function(event, delta) {
							var vel = Math.abs(delta*10);
							$dragger.css("left", $dragger.position().left-(delta*vel));
							ScrollX();
							if($dragger.position().left<0){
								$dragger.css("left", 0);
								$customScrollBox_container.stop();
								ScrollX();
							}
							if($dragger.position().left>$dragger_container.width()-$dragger.width()){
								$dragger.css("left", $dragger_container.width()-$dragger.width());
								$customScrollBox_container.stop();
								ScrollX();
							}
							return false;
						});
					}
				});
				
				//scroll buttons
				if(scrollBtnsSupport=="yes"){
					$scrollDownBtn.mouseup(function(){
						BtnsScrollXStop();
					}).mousedown(function(){
						BtnsScrollX("down");
					});
				
					$scrollUpBtn.mouseup(function(){
						BtnsScrollXStop();
					}).mousedown(function(){
						BtnsScrollX("up");
					});
				
					$scrollDownBtn.click(function(e) {
					  if(mobileChecker.isMobile){
						BtnsScrollX("down");
						setTimeout(function(){BtnsScrollXStop();},500);
					  }
						e.preventDefault();
					});
					$scrollUpBtn.click(function(e) {
					  if(mobileChecker.isMobile){
						BtnsScrollX("up");
						setTimeout(function(){BtnsScrollXStop();},500);
					  }
						e.preventDefault();
					});
				
					btnsScrollTimerX=0;
				
					function BtnsScrollX(dir){
						if(dir=="down"){
							var btnsScrollTo=$dragger_container.width()-$dragger.width();
							var scrollSpeed=Math.abs($dragger.position().left-btnsScrollTo)*(100/scrollBtnsSpeed);
							$dragger.stop().animate({left: btnsScrollTo}, scrollSpeed,"linear");
						} else {
							var btnsScrollTo=0;
							var scrollSpeed=Math.abs($dragger.position().left-btnsScrollTo)*(100/scrollBtnsSpeed);
							$dragger.stop().animate({left: -btnsScrollTo}, scrollSpeed,"linear");
						}
						clearInterval(btnsScrollTimerX);
						btnsScrollTimerX = setInterval( ScrollX, 20);
					}
				
					function BtnsScrollXStop(){
						clearInterval(btnsScrollTimerX);
						$dragger.stop();
					}
				}

				//scroll
				var scrollAmount=(totalContent-visibleWidth)/(draggerContainerWidth-draggerWidth);
				function ScrollX(){
					var draggerX=$dragger.position().left;
					var targX=-draggerX*scrollAmount;
					var thePos=$customScrollBox_container.position().left-targX;
					$customScrollBox_container.stop().animate({left: "-="+thePos}, animSpeed, easeType);
				}
				
				function MoveDraggerX(){
					var containerX = $customScrollBox_container.position().left;
					var moveDraggerX = $dragger_container.width() * (containerX / ($customScrollBox.width()-$customScrollBox_container.width()));
					if(moveDraggerX < 0){
						moveDraggerX = 0;
					} else if(moveDraggerX > $dragger_container.width()-$dragger.width()){
						moveDraggerX = $dragger_container.width()-$dragger.width();
					}
					$dragger.stop().animate({left:moveDraggerX});
				}
				$dragger_container.css('visibility','visible');
				$scrollDownBtn.css('visibility','visible');
				$scrollUpBtn.css('visibility','visible');
			} else { //disable scrollbar if content is short
				$dragger.css("left",0).css("display","none"); //reset content scroll
				$customScrollBox_container.css("left",0);
				$dragger_container.css("display","none");
				$scrollDownBtn.css("display","none");
				$scrollUpBtn.css("display","none");
			}
		//vertical scrolling ------------------------------
		} else {
			var visibleHeight=$customScrollBox.height();
			if($customScrollBox_container.height()>visibleHeight){ //enable scrollbar if content is long
				$dragger.css("display","block");
				if(reloadType!="resize" && $customScrollBox_container.height()!=$customScrollBox.data("contentHeight")){
					$dragger.css("top",0);
					$customScrollBox_container.css("top",0);
					$customScrollBox.data("contentHeight",$customScrollBox_container.height());
				}
				$dragger_container.css("display","block");
				$scrollDownBtn.css("display","inline-block");
				$scrollUpBtn.css("display","inline-block");
				var totalContent=$customScrollBox_content.height();
				var minDraggerHeight=$customScrollBox.data("minDraggerHeight");
				var draggerContainerHeight=$dragger_container.height();
		
				function AdjustDraggerHeight(){
					if(draggerDimType=="auto"){
						var adjDraggerHeight=Math.round(totalContent-((totalContent-visibleHeight)*1.3)); //adjust dragger height analogous to content
						if(adjDraggerHeight<=minDraggerHeight){ //minimum dragger height
							$dragger.css("height",minDraggerHeight+"px").css("line-height",minDraggerHeight+"px");
						} else if(adjDraggerHeight>=draggerContainerHeight){
							$dragger.css("height",draggerContainerHeight-10+"px").css("line-height",draggerContainerHeight-10+"px");
						} else {
							$dragger.css("height",adjDraggerHeight+"px").css("line-height",adjDraggerHeight+"px");
						}
					}
				}
				AdjustDraggerHeight();
		
				var targY=0;
				var draggerHeight=$dragger.height();
				$dragger.draggable({ 
					axis: "y", 
					containment: "parent", 
					drag: function(event, ui) {
						Scroll();
					}, 
					stop: function(event, ui) {
						DraggerRelease();
					}
				});
				
				
				//enabling touch swipe - requires mobileChecker
				//Assign handlers to the simple direction handlers.
				if(mobileChecker.isMobile){
					function enableYDragger(){
						var thumbContainerHeight = $customScrollBox_container.height();
						var currentImg=0;
						var speed=500;
						var thumbs;
						var lastPos = 0;
						var isDragging = false;

						var swipeOptions=
						{
							triggerOnTouchEnd : true,
							swipeStatus : swipeStatus,
							allowPageScroll:"horizontal",
							threshold:0
						}
						
						$(function()
						{
							thumbs = $customScrollBox_container;
							thumbs.swipe( swipeOptions );
						});
					
							
						/**
						* Catch each phase of the swipe.
						* move : we drag the div.
						* cancel : we animate back to where we were
						* end : we animate to the next image
						*/			
						function swipeStatus(event, phase, direction, distance)
						{
							
							if( phase=="start" ){
								isDragging = true;
							}
							//If we are moving before swipe, and we are going L or R in X mode, or U or D in Y mode then drag.
							if( phase=="move" && (direction=="up" || direction=="down") )
							{
								var duration=0;
								if (direction == "up")
									scrollImagesY(-distance, duration);
								
								else if (direction == "down")
									scrollImagesY(distance, duration);
							}
							else if ( phase == "cancel")
							{
									scrollImagesY(lastPos, speed);
							}
							else if ( phase =="end" )
							{
								isDragging = false;
								if (thumbs.position().top > 0){
									scrollMaxTop();
								}
								
								else if (thumbs.position().top < -(thumbs.height() - $customScrollBox.height())){
									scrollMaxBottom();
								}
								
								else {
									lastPos = thumbs.position().top;
								}
							}
						}

						/**
						* Manuallt update the position of the imgs on drag
						*/
						function scrollMaxTop(){
							thumbs.stop().animate({top: 0 + 'px'},speed, function(){
								lastPos = thumbs.position().top;
							});
							MoveDraggerY();
						}
		
						function scrollMaxBottom(){
							thumbs.stop().animate({top: -(totalContent - (visibleHeight/bottomSpace)) + 'px'},speed, function(){
								lastPos = thumbs.position().top;
							});
							MoveDraggerY();
						}

						function scrollImagesY(distance, duration)
						{
							//inverse the number we set in the css
							var value = (distance<0 ? "" : "-") + Math.abs(distance).toString();
							thumbs.stop().animate({top:(Number(lastPos) + Number(distance)) + 'px'},duration);
							MoveDraggerY();
						}
					}
					enableYDragger();
				}
				
				
				
				$dragger_container.click(function(e) {
					var $this=$(this);
					var mouseCoord=(e.pageY - $this.offset().top);
					if(mouseCoord<$dragger.position().top || mouseCoord>($dragger.position().top+$dragger.height())){
						var targetPos=mouseCoord+$dragger.height();
						if(targetPos<$dragger_container.height()){
							$dragger.css("top",mouseCoord);
							Scroll();
						} else {
							$dragger.css("top",$dragger_container.height()-$dragger.height());
							Scroll();
						}
					}
				});

				//mousewheel
				$(function($) {
					if(mouseWheelSupport=="yes"){
						$customScrollBox.unbind("mousewheel");
						$customScrollBox.bind("mousewheel", function(event, delta) {
							var vel = Math.abs(delta*10);
							$dragger.css("top", $dragger.position().top-(delta*vel));
							Scroll();
							if($dragger.position().top<0){
								$dragger.css("top", 0);
								$customScrollBox_container.stop();
								Scroll();
							}
							if($dragger.position().top>$dragger_container.height()-$dragger.height()){
								$dragger.css("top", $dragger_container.height()-$dragger.height());
								$customScrollBox_container.stop();
								Scroll();
							}
							return false;
						});
					}
				});

				//scroll buttons
				if(scrollBtnsSupport=="yes"){
					$scrollDownBtn.mouseup(function(){
						BtnsScrollStop();
					}).mousedown(function(){
						BtnsScroll("down");
					});
				
					$scrollUpBtn.mouseup(function(){
						BtnsScrollStop();
					}).mousedown(function(){
						BtnsScroll("up");
					});
				
					$scrollDownBtn.click(function(e) {
					  if(mobileChecker.isMobile){
  						BtnsScroll("down");
						setTimeout(function(){BtnsScrollStop();},500);
					  }
						e.preventDefault();
						
					});
					$scrollUpBtn.click(function(e) {
					  if(mobileChecker.isMobile){
  						BtnsScroll("up");
						setTimeout(function(){BtnsScrollStop();},500);
					  }
						e.preventDefault();
					});
				
					btnsScrollTimer=0;
				
					function BtnsScroll(dir){
						if(dir=="down"){
							var btnsScrollTo=$dragger_container.height()-$dragger.height();
							var scrollSpeed=Math.abs($dragger.position().top-btnsScrollTo)*(100/scrollBtnsSpeed);
							$dragger.stop().animate({top: btnsScrollTo}, scrollSpeed,"linear");
						} else {
							var btnsScrollTo=0;
							var scrollSpeed=Math.abs($dragger.position().top-btnsScrollTo)*(100/scrollBtnsSpeed);
							$dragger.stop().animate({top: -btnsScrollTo}, scrollSpeed,"linear");
						}
						clearInterval(btnsScrollTimer);
						btnsScrollTimer = setInterval( Scroll, 20);
					}
				
					function BtnsScrollStop(){
						clearInterval(btnsScrollTimer);
						$dragger.stop();
					}
				}
				
				//scroll
				if(bottomSpace<1){
					bottomSpace=1; //minimum bottomSpace value is 1
				}
				var scrollAmount=(totalContent-(visibleHeight/bottomSpace))/(draggerContainerHeight-draggerHeight);
				function Scroll(){
					var draggerY=$dragger.position().top;
					var targY=-draggerY*scrollAmount;
					var thePos=$customScrollBox_container.position().top-targY;
					$customScrollBox_container.stop().animate({top: "-="+thePos}, animSpeed, easeType);
				}
				
				function MoveDraggerY(){
					var containerY = $customScrollBox_container.position().top;
					var moveDraggerY = $dragger_container.height() * (containerY / ($customScrollBox.height()-$customScrollBox_container.height()));
					if(moveDraggerY < 0){
						moveDraggerY = 0;
					} else if(moveDraggerY > $dragger_container.height()-$dragger.height()){
						moveDraggerY = $dragger_container.height()-$dragger.height();
					}
					$dragger.stop().animate({top:moveDraggerY});
				}
				
				$dragger_container.css('visibility','visible');
				$scrollDownBtn.css('visibility','visible');
				$scrollUpBtn.css('visibility','visible');
				
			} else { //disable scrollbar if content is short
				$dragger.css("top",0).css("display","none"); //reset content scroll
				$customScrollBox_container.css("top",0);
				$dragger_container.css("display","none");
				$scrollDownBtn.css("display","none");
				$scrollUpBtn.css("display","none");
			}
		}
		
		$dragger.mouseup(function(){
			DraggerRelease();
		}).mousedown(function(){
			DraggerPress();
		});

		function DraggerPress(){
			$dragger.addClass("dragger_pressed");
		}

		function DraggerRelease(){
			$dragger.removeClass("dragger_pressed");
		}
	}
	
	$(window).resize(function() {
		if(scrollType=="horizontal"){
			if($dragger.position().left>$dragger_container.width()-$dragger.width()){
				$dragger.css("left", $dragger_container.width()-$dragger.width());
			}
		} else {
			if($dragger.position().top>$dragger_container.height()-$dragger.height()){
				$dragger.css("top", $dragger_container.height()-$dragger.height());
			}
		}
		CustomScroller("resize");
	});
};  
})(jQuery);
