
/* malihu custom scrollbar plugin - http://manos.malihu.gr */
(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")); //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();
		}
		});
	
		$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");
		}).mouseout(function(){
			BtnsScrollXStop();
		});
		
		$scrollUpBtn.mouseup(function(){
			BtnsScrollXStop();
		}).mousedown(function(){
			BtnsScrollX("up");
		}).mouseout(function(){
			BtnsScrollXStop();
		});
		
		$scrollDownBtn.click(function(e) {
			e.preventDefault();
		});
		$scrollUpBtn.click(function(e) {
			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);
		}
	} 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();
		}
		});
		
		$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");
		}).mouseout(function(){
			BtnsScrollStop();
		});
		
		$scrollUpBtn.mouseup(function(){
			BtnsScrollStop();
		}).mousedown(function(){
			BtnsScroll("up");
		}).mouseout(function(){
			BtnsScrollStop();
		});
		
		$scrollDownBtn.click(function(e) {
			e.preventDefault();
		});
		$scrollUpBtn.click(function(e) {
			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);
		}
	} 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);
