(function (factory) { if(typeof module === "object" && typeof module.exports === "object") { module.exports = factory(require("jquery"), window, document); } else { factory(jQuery, window, document); } }(function($, window, document, undefined) { function SplitterManager() { var splitters = [], current = null, bgColor = null, dragObj = null, overlay = null; function doResize(current, ev) { var parent = current.parent; var div1 = current.div1; var div2 = current.div2; var horizontal = current.orientation() == "horizontal"; var rbSize = 0; if (current.resizebar) { rbSize = horizontal ? current.resizebar.outerWidth(true) : current.resizebar.outerHeight(true); } var keepLeft = current.keepLeft(); if (horizontal) { var cw = parent.width(); var l, r; if (keepLeft) { l = div1.outerWidth(true); if (l > cw) { l = cw; } r = cw - l - rbSize; if (r < 0) { r = 0; } } else { r = div2.outerWidth(true); if (r > cw) { r = cw; } l = cw - r - rbSize; if (l < 0) { l = 0; } } current.position(l); } else { var ch = parent.height(); var t, b; if (keepLeft) { t = div1.outerHeight(true); if (t > ch) { t = ch; } b = ch - t - rbSize; if (b < 0) { b = 0; } } else { b = div2.outerHeight(true); if (b > ch) { b = ch; } t = ch - b - rbSize; if (t < 0) { t = 0; } } current.position(t); } if (current.windowResized()) { curent.windowResized()(ev); } } $(document.documentElement).mousedown(function(ev) { var buttonState = typeof(ev.buttons) === "undefined" ? ev.which : ev.buttons; if (buttonState !== 1) { return; } dragObj = current; if (dragObj) { bgColor = dragObj.resizebar.css("background-color"); dragObj.resizebar.css("background-color", '#696969'); var $body = $('body'); $body.css('cursor', dragObj.resizebar.css("cursor")); if (!overlay) { overlay = $("
").css({ position: "absolute", width: "100%", height: "100%", left: 0, top: 0, "z-index": 9999 }); } $body.append(overlay); return false; } }).mouseup(function() { if (dragObj) { dragObj.resizebar.css("background-color", bgColor); $('body').css('cursor', 'auto'); } if (overlay) { overlay.remove(); overlay = null; } dragObj = null; }).mousemove(function(ev) { if (!dragObj) { return; } var buttonState = typeof(ev.buttons) === "undefined" ? ev.which : ev.buttons; if (!buttonState) { dragObj = null; return; } var horizontal = dragObj.orientation() == "horizontal"; if (horizontal) { var pw = dragObj.parent.width(); var x = ev.clientX - dragObj.parent.offset().left; if (x < 0) { x = 0; } else if (x > pw) { x = pw; } dragObj.position(x); } else { var ph = dragObj.parent.height(); var y = ev.clientY - dragObj.parent.offset().top; if (y < 0) { y = 0; } else if (y > ph) { y = ph; } dragObj.position(y); } if (dragObj.paneResized()) { dragObj.paneResized()(ev); } for (var i=0; i= 0) { splitters.splice(idx, 1); } } $.extend(this, { "size": function() { return splitters.length; }, "setCurrent" : setCurrent, "add" : add, "release" : release }); } /** * The splitter for element * @param parrent - parent element * @param div1 - The element which placed in above or left in parent element * @param div1 - The element which placed in below or right in parent element * @param horizontal - If true, this makes horizontal split, or vertical split. */ function Splitter(parent, div1, div2, horizontal, barwidth) { if (!manager) { manager = new SplitterManager(); } manager.add(this); var self = this, keepLeft = true, limit = 0, paneResized = null, windowResized = null, parent = $(parent), div1 = $(div1), div2 = $(div2), resizebar = $("
").appendTo(parent); resizebar.addClass("splitter-" + manager.size); resizebar.css({ "background-color" : "#a9a9a9", "position" : "absolute", "z-index" : 20, "overflow" : "hidden" }).mouseenter(function() { manager.setCurrent(self); }).mouseleave(function() { manager.setCurrent(null); }); if (horizontal) { var w1 = div1.outerWidth(true); var w2 = parent.width() - w1; div1.css({ "position" : "absolute", "overflow-x" : "auto", "left" : 0, "width" : w1 }); resizebar.css({ "left" : w1, "width" : barwidth, "height" : "100%", "cursor" : "col-resize" }); var w3 = resizebar.outerWidth(true); div2.css({ "position" : "absolute", "overflow-x" : "auto", "right" : 0, "width" : w2 - w3 }); } else { var h1 = div1.outerHeight(true); var h2 = div2.outerHeight(true); div1.css({ "position" : "absolute", "overflow-y" : "auto", "top" : 0, "height" : h1 }); resizebar.css({ "top" : h1, "width" : "100%", "height" : barwidth, "cursor" : "row-resize" }); var h3 = resizebar.outerHeight(true); div2.css({ "position" : "absolute", "overflow-y" : "auto", "bottom" : 0, "height" : h2 - h3 }); } $.extend(this, { "parent" : parent, "div1" : div1, "div2" : div2, "resizebar" : resizebar, "orientation" : function() { var cursor = self.resizebar.css("cursor").toLowerCase(); return cursor == "col-resize" ? "horizontal" : "vertical"; }, "paneResized" : function(func) { if (func === undefined) { return paneResized; } else { paneResized = func; return self; } }, "windowResized" : function(func) { if (func === undefined) { return windowResized; } else { windowResized = func; return self; } }, "keepLeft" : function(b) { if (b === undefined) { return keepLeft; } else { keepLeft = b; return self; } }, "limit" : function(n) { if (n === undefined) { return limit; } else { limit = n; return self; } }, "position" : function(n) { if (self.orientation() == "horizontal") { if (n === undefined) { return resizebar.css("left"); } else { var low = limit; var high = parent.width() - limit; if (n < low) { n = low; } else if (n > high) { n = high; } resizebar.css("left", n); div1.css("width", n); div2.css("width", parent.width() - resizebar.outerWidth(true) - n); } } else { if (n === undefined) { return resizebar.css("top"); } else { var low = limit; var high = parent.height() - limit; if (n < low) { n = low; } else if (n > high) { n = high; } resizebar.css("top", n); div1.css("height", n); div2.css("height", parent.height() - resizebar.outerHeight(true) - n); } } return self; }, "release" : function() { manager.release(self); return self; } }); } var manager = null; $.fn.splitter = function(options) { var div1 = this.children().first(); var div2 = div1.next(); var settings = { "div1" : div1, "div2" : div2, "orientation" : "horizontal", "limit" : 0, "keepLeft" : true, "paneResized" : null, "windowResized" : null, "barwidth": 4 }; if (options) { $.extend(settings, options); } if (settings.orientation === "horizontal") { this.css("width", "100%"); if (div1.width() === this.width()) { div1.css("width", Math.floor(this.width() / 10 * 3)); } } else { this.css("height", "100%"); var h1 = div1.height(); if (h1 < (this.height() / 10) || settings.limit > 0 && h1 < settings.limit) { h1 = settings.limit || 200; div1.css("height", settings.limit || 200); } div2.css("height", this.height() - h1); } var splitter = new Splitter(this, settings.div1, settings.div2, settings.orientation == "horizontal", settings.barwidth); splitter.limit(settings.limit); splitter.keepLeft(settings.keepLeft); splitter.paneResized(settings.paneResized); splitter.windowResized(settings.windowResized); return splitter; } }));