/* 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);
