/* malihu custom scrollbar plugin - http://manos.malihu.gr */
(function ($) {
$.fn.mCustomScrollbar = function (scrollType,animSpeed,easeType,bottomSpace,draggerDimType,mouseWheelSupport,scrollBtnsSupport,scrollBtnsSpeed){
	$(this).each(function() {
//		if ($(this).css("display")!="none"){
			var $this	=	$(this);
			var $customScrollBox=$(this).find(".customScrollBox");
			var $customScrollBox_container=$(this).find(".customScrollBox .container");
			var $customScrollBox_content=$(this).find(".customScrollBox .content");
			var $dragger_container=$(this).find(".dragger_container");
			var $scroll_container=$(this).find(".scroll_container");
			var	$dragger=$(this).find(".dragger");
	
			var $scrollUpBtn=$(this).find(".scrollUpBtn");
			var $scrollDownBtn=$(this).find(".scrollDownBtn");
			var $customScrollBox_horWrapper=$(this).find(".customScrollBox .horWrapper");

			$this.unbind("content_change").bind("content_change",function(){
				CustomScroller("resize");
			});

			if ($dragger.length>0) { //catch any scroll bars that haven't been drawn yet}

				$scrollDownBtn.css("display","inline-block");
				$scrollUpBtn.css("display","inline-block");

				//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());
				}
	
				function CustomScroller(reloadType){
													
					//horizontal scrolling ------------------------------
					if(scrollType=="horizontal"){
					
						w1=$this.width();
						w2=w1;	
						if(scrollBtnsSupport=="yes"){
							w2-=28;
						}	
						if ($scroll_container.width()!=w1) {
							$scroll_container.css({"width":w1});
							$dragger_container.css({"width":w2});
						}						
					
						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.mouseover(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.mouseout(function(){
									BtnsScrollXStop();
								}).mouseover(function(){
									BtnsScrollX("down");
								});
				
								$scrollUpBtn.mouseout(function(){
									BtnsScrollXStop();
								}).mouseover(function(){
									BtnsScrollX("up");
								});
				
								$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 {
					
						h1=$this.height();
						h2=h1;	
						if(scrollBtnsSupport=="yes"){
							h2-=28;
						}	
						if ($scroll_container.height()!=h1) {
							$scroll_container.css({"height":h1});
							$dragger_container.css({"height":h2});
						}						

						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
									var adjDraggerHeight=Math.round(draggerContainerHeight*(visibleHeight/totalContent)); //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.mouseover(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.mouseout(function(){
									BtnsScrollStop();
								}).mouseover(function(){
									BtnsScroll("down");
								});				
								$scrollUpBtn.mouseout(function(){
									BtnsScrollStop();
								}).mouseover(function(){
									BtnsScroll("up");
								});

								$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");
					}
				}
			
				CustomScroller();
	
				$(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);
