/* 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", 10000); //set a rediculously high width value ;)                

        // Outwide - hack for IE6 & IE7 problem
        if (($.browser.msie) && ($.browser.version == "6.0" || $.browser.version == "7.0")) {
          $customScrollBox_horWrapper.css("width", $('#tblPPIBooking').width());
        }

        $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);
