/* 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());
  }
  
  //check for safari browser on mac os to lower mousewheel delta 
  var os=navigator.userAgent;
  if (os.indexOf("Mac")!=-1 && os.indexOf("Safari")!=-1 && os.indexOf("AppleWebKit")!=-1 && os.indexOf("Chrome")==-1){ 
    var mousewheelDelta=1;
  } else {
    var mousewheelDelta=10;
  }
  
  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',
                      visibility: 'visible'
                     });
       
        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',
                                visibility: 'visible'
                               });
        $scrollDownBtn.css({display:'inline-block',
                            visibility: 'visible'}
                          );
        $scrollUpBtn.css({display:'inline-block',
                          visibility: 'visible'
                         });
        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*mousewheelDelta);
              $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) {
            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',
                      visibility: 'visible'
                     });
        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',
                      visibility: 'visible'
                     });
        $scrollDownBtn.css({display:'inline-block',
                            visibility: 'visible'
                           });
        $scrollUpBtn.css({display:'inline-block',
                         visibility: 'visible'});
        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*mousewheelDelta);
              $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) {
            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);
