﻿/// <reference path="jquery-1.4.2.min.js" />

CustomScrollbarHandler = function () {
    this.ClippingScrollboxHeight = 150;
}

CustomScrollbarHandler.prototype = {
    Initialize: function () {
        $j(".RoundedBox.Scrollable").each(function () {
            var current = $j(this);
            current.css("height", "194px");

            var sb = CreateElement("div", "Scrollbar");
            var upperEnd = CreateElement("div", "UpperEnd", "<img src=\"/Images/Layout/RoundedBoxScrollbarTopArrow.png\" alt=\"\" />", sb);
            var middle = CreateElement("div", "Middle", null, sb);
            var lowerEnd = CreateElement("div", "LowerEnd", "<img src=\"/Images/Layout/RoundedBoxScrollbarBottomArrow.png\" alt=\"\" />", sb);
            var handle = CreateElement("div", "Handle", null, sb);

            upperEnd.click(function (e) {
                customScrollbarHandler.UpdateScrollbarPos($j(this), -2);
            });
            lowerEnd.click(function (e) {
                customScrollbarHandler.UpdateScrollbarPos($j(this), 2);
            });

            middle.mousemove(customScrollbarHandler.HandleScrollbarDragging);
            handle.mousemove(customScrollbarHandler.HandleScrollbarDragging);
            current.mousemove(customScrollbarHandler.HandleScrollbarDragging);

            upperEnd.mouseenter(function (e) { e.preventDefault(); e.stopPropagation(); });
            lowerEnd.mouseenter(function (e) { e.preventDefault(); e.stopPropagation(); });

            current.append(sb);

            // Caching heights.
            // [MB]
            var clippingHeight = $j(".ScrollableAreaClipping", current).height();
            var contentToScrollHeight = customScrollbarHandler.GetHeightFromScrollbar(sb);
            sb.attr("MiddleAreaHeight", middle.height());
            sb.attr("HandleHeight", handle.height());
            sb.attr("ScrollableAreaClippingHeight", clippingHeight);
            sb.attr("ContentToScrollHeight", contentToScrollHeight);

            if (clippingHeight > contentToScrollHeight) {
                handle.css("display", "none");
            }
        });
        var wasScrolled = false;
        var lastClickedItem = null;
        $j(".RoundedBoxItem").click(function (e) {
            var abstract = $j(this).children(".Abstract");
            if (abstract.css("display") == "block") {
                window.location = $j(this).children("a").attr("href");
                abstract.slideUp();
            }
            else {
                if (lastClickedItem != null) {
                    lastClickedItem.css("display", "none");
                }
                if (!abstract.height()) {
                    window.location = $j(this).children("a").attr("href");
                }
                else {
                    abstract.slideDown();
                }
            }
            lastClickedItem = abstract;
            e.preventDefault();
            e.stopPropagation();
            
            if (abstract.height()) {
                var box = $j(this);
                var description = $j(".RoundedBoxItemDescription", box);

                if (description.length > 0) {
                    customScrollbarHandler.StartTimeoutOnItem(box, function () {
                        description.css("display", "block").css("visibility", "hidden");
                        if (!description.attr("InitialHeight"))
                            description.attr("InitialHeight", description.height());

                        var targetHeight = description.attr("InitialHeight");
                        description.stop().animate({ height: parseInt(targetHeight) }, 200);
                    });
                }

                var abc = $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(box));
                var boxTop = "0";
                if (abc.css("top") != "auto") {
                    boxTop = abc.css("top");
                }

                if ((($j(box).prevAll(".RoundedBoxItem").length * 50) + parseInt(boxTop)) > 100 && !wasScrolled) {
                    abc.animate({ "top": parseInt(boxTop) - 50 }, "slow");
                    wasScrolled = true;
                }
            }

        }); //.mouseleave(function () {
        //            var box = $j(this);
        //            var description = $j(".RoundedBoxItemDescription", box);
        //            if (description.length > 0) {
        //                customScrollbarHandler.StartTimeoutOnItem(box, function () {
        //                    description.animate({ height: 0 }, 200, function () { $j(this).css("display", "none") });
        //                });
        //            }
        //            var abc = $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(box));
        //            var boxTop = "0";
        //            if (abc.css("top") != "auto") {
        //                boxTop = abc.css("top");
        //            }
        //            if (wasScrolled) {
        //                abc.animate({ "top": parseInt(boxTop) + 50 }, "slow");
        //                wasScrolled = false;
        //            }
        //        });
    },

    StartTimeoutOnItem: function (item, callback) {
        var localTimeout = item.attr("LocalTimeout");
        if (localTimeout) {
            window.clearTimeout(parseInt(localTimeout));
        }

        var tsHandle = window.setTimeout(callback, 100);
        item.attr("LocalTimeout", tsHandle);
    },

    GetScrollbar: function (currentItem) {
        return (currentItem.hasClass("Scrollbar")) ? currentItem : currentItem.parents(".Scrollbar");
    },

    GetHandle: function (currentItem, scrollbarElement) {
        // The last part is just a performance thing (one less search) - remove it if needed.
        // [MB]
        return (currentItem.hasClass("Handle")) ? currentItem : $j(".Handle", (scrollbarElement) ? scrollbarElement : customScrollbarHandler.GetScrollbar(currentItem));
    },

    GetScrollboxContainer: function (currentItem) {
        return currentItem.parents(".RoundedBox");
    },

    GetHeightFromScrollbar: function (scrollbarElement) {
        // Caching the height value here.
        // [MB]
        var scrollingContentHeight = scrollbarElement.attr("ScrollingContentHeight");
        if (!scrollingContentHeight) {
            var scrollableArea = $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(scrollbarElement));

            if (scrollableArea) {
                scrollingContentHeight = scrollableArea.height();
                scrollbarElement.attr("ScrollingContentHeight", scrollingContentHeight);
            }
        }

        return parseInt(scrollingContentHeight);
    },

    UpdateScrollbarPos: function (clickedArrow, units) {
        var current = clickedArrow.parents(".RoundedBox");
        if (current.length > 1)
            current = $j(current[0]);

        var scrollbarElement = current.find(".Scrollbar");
        var scrollableArea = $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(scrollbarElement));
        var handle = customScrollbarHandler.GetHandle(current, scrollbarElement);
        var height = customScrollbarHandler.GetHeightFromScrollbar(scrollbarElement);

        var middlePartHeight = parseInt(scrollbarElement.attr("MiddleAreaHeight"));
        var handleHeight = parseInt(scrollbarElement.attr("HandleHeight"));
        var clippingHeight = parseInt(scrollbarElement.attr("ScrollableAreaClippingHeight"));
        var contentToScrollHeight = parseInt(scrollbarElement.attr("ContentToScrollHeight"));
        var maxHandleVal = middlePartHeight - handleHeight;

        var distance = units * 20;
        var newPosition = current.find(".Handle").position().top + distance;

        //        var movedDistance = scrollableArea.css("top");
        //        if (movedDistance && (movedDistance != "auto")) {
        //            newPosition += parseInt(movedDistance);
        //        }

        newPosition -= Math.round(handleHeight / 2);

        if (newPosition > maxHandleVal)
            newPosition = maxHandleVal;
        if (newPosition < 5)
            newPosition = 5;

        handle.css("top", newPosition);


        // Calculating percentages.
        // [MB]
        var possibleValuesOnScrollbar = maxHandleVal - 5;
        var possibleValuesOnClipping = contentToScrollHeight - clippingHeight;
        var percentageOfHandler = (newPosition - 5) / possibleValuesOnScrollbar;
        var newClippedContentTop = -Math.round(possibleValuesOnClipping * percentageOfHandler);

        $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(scrollbarElement)).css("top", newClippedContentTop);

        //        e.preventDefault();
        //        e.stopPropagation();
    },

    HandleScrollbarDragging: function (e) {
        var isIEAndPressed = ((e.which == 1) && isIE);
        var isOtherAndPressed = (GlobalConfig.MousePressed && isOther);

        if (isIEAndPressed || isOtherAndPressed) {
            var current = $j(this);
            var roundedBoxDragged = false;
            if (current.hasClass("Middle")) {
                roundedBoxDragged = true;
                current = $j(".Handle", $j(this));
            }

            var scrollbarElement = customScrollbarHandler.GetScrollbar(current);
            var scrollableArea = $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(scrollbarElement));
            var handle = customScrollbarHandler.GetHandle(current, scrollbarElement);
            var height = customScrollbarHandler.GetHeightFromScrollbar(scrollbarElement);

            var middlePartHeight = parseInt(scrollbarElement.attr("MiddleAreaHeight"));
            var handleHeight = parseInt(scrollbarElement.attr("HandleHeight"));
            var clippingHeight = parseInt(scrollbarElement.attr("ScrollableAreaClippingHeight"));
            var contentToScrollHeight = parseInt(scrollbarElement.attr("ContentToScrollHeight"));
            var maxHandleVal = middlePartHeight - handleHeight;

            var newPosition = (typeof (e.offsetY) != "undefined") ? e.offsetY : e.layerY;
            var jCurrentTarget = $j(e.currentTarget);
            if (jCurrentTarget.hasClass("Handle"))
                newPosition += parseInt(jCurrentTarget.css("top"));
            if (roundedBoxDragged) {
                newPosition = $j(e.target).position().top + e.offsetY;
                var movedDistance = scrollableArea.css("top");
                if (movedDistance && (movedDistance != "auto")) {
                    newPosition += parseInt(movedDistance);
                }
            }

            newPosition -= Math.round(handleHeight / 2);

            if (newPosition > maxHandleVal)
                newPosition = maxHandleVal;
            if (newPosition < 5)
                newPosition = 5;

            handle.css("top", newPosition);


            // Calculating percentages.
            // [MB]
            var possibleValuesOnScrollbar = maxHandleVal - 5 - 25;
            var possibleValuesOnClipping = contentToScrollHeight - clippingHeight;
            var percentageOfHandler = (newPosition - 5) / possibleValuesOnScrollbar
            var newClippedContentTop = -Math.round(possibleValuesOnClipping * percentageOfHandler);

            $j(".ScrollableArea", customScrollbarHandler.GetScrollboxContainer(scrollbarElement)).css("top", newClippedContentTop);

            e.preventDefault();
            e.stopPropagation();
        }
    }
}

var customScrollbarHandler = new CustomScrollbarHandler();

$j(document).ready(function () {
    customScrollbarHandler.Initialize();
});
