(function($) { jQuery.extend( { edotScrollBar: function(settings) { settings = jQuery.extend( { mousewheel : true, relativeDivId : "scrollbarContainer", absoluteDivId : "scrollbarElement", scrollButtonUpId : "scrollbarUp", scrollButtonDownId : "scrollbarDown", buttonStepPx : 5, mouseStepPx : 10, scrollbarDelay : 15 },settings); var relative = $("#" + settings.relativeDivId); var absolute = $("#" + settings.absoluteDivId); var buttonUp = $("#" + settings.scrollButtonUpId); var buttonDown = $("#" + settings.scrollButtonDownId); if (!absolute || absolute.length == 0 || !relative || relative.length == 0) return; var relativeHeight = relative.height(); var aOffset = absolute.offset({margin: true}); var rOffset = relative.offset({margin: true}); var absoluteHeight = absolute.height(); absoluteHeight += Math.abs(aOffset.top - rOffset.top); var maxTop = relativeHeight - absoluteHeight; var timer; jQuery.edotScrollBar.scroll = function(direction) { /** * Needs to recalculate because of changing contents */ absoluteHeight = absolute.height(); absoluteHeight += Math.abs(aOffset.top - rOffset.top); maxTop = relativeHeight - absoluteHeight; if (maxTop >= 0) return; var actualTop = parseInt(absolute.css("top")); var newTop = Math.max(Math.min(direction + actualTop, 0), maxTop); absolute.css("top", newTop + "px"); } /** * If buttons not null */ if (settings.scrollButtonUpId && settings.scrollButtonDownId) { /** * Down arrow mouse pressed */ buttonDown.mousedown(function() { if (timer) { clearTimeout(timer); timer = null; } timer = setInterval("jQuery.edotScrollBar.scroll(-" + settings.buttonStepPx + ");", settings.scrollbarDelay); }); /** * Down arrow mouse released */ buttonDown.mouseup(function() { if (timer) { clearTimeout(timer); timer = null; } }); /** * Up arrow mouse pressed */ buttonUp.mousedown(function() { if (timer) { clearTimeout(timer); timer = null; } timer = setInterval("jQuery.edotScrollBar.scroll(" + settings.buttonStepPx + ");", settings.scrollbarDelay); }); /** * Up arrow mouse released */ buttonUp.mouseup(function() { if (timer) { clearTimeout(timer); timer = null; } }); /** * Mouse leaves down the button */ buttonDown.mouseout(function() { if (timer) { clearTimeout(timer); timer = null; } }); /** * Mouse leaves up the button */ buttonUp.mouseout(function() { if (timer) { clearTimeout(timer); timer = null; } }); } /** * If mousewheel is allowed */ if (settings.mousewheel) { absolute.mousewheel(function(event, direction) { jQuery.edotScrollBar.scroll(direction > 0? settings.mouseStepPx : settings.mouseStepPx * (-1)); return false; }, null, true); } } }); })(jQuery);