18 $.fn.layout =
function (opts) {
30 paneClass: prefix+
"pane"
31 , resizerClass: prefix+
"resizer"
32 , togglerClass: prefix+
"toggler"
33 , togglerInnerClass: prefix+
""
34 , buttonClass: prefix+
"button"
35 , contentSelector:
"."+prefix+
"content"
36 , contentIgnoreSelector:
"."+prefix+
"ignore"
43 , scrollToBookmarkOnLoad:
true
45 applyDefaultStyles:
false
50 , contentSelector: defaults.contentSelector
51 , contentIgnoreSelector: defaults.contentIgnoreSelector
52 , paneClass: defaults.paneClass
53 , resizerClass: defaults.resizerClass
54 , togglerClass: defaults.togglerClass
55 , buttonClass: defaults.buttonClass
56 , resizerDragOpacity: 1
58 , maskIframesOnResize:
true
64 , togglerLength_open: 50
65 , togglerLength_closed: 50
66 , togglerAlign_open:
"center"
67 , togglerAlign_closed:
"center"
68 , togglerTip_open:
"Close"
69 , togglerTip_closed:
"Open"
70 , resizerTip:
"Resize"
71 , sliderTip:
"Slide Open"
72 , sliderCursor:
"pointer"
73 , slideTrigger_open:
"click"
74 , slideTrigger_close:
"mouseout"
75 , hideTogglerOnSlide:
false
76 , togglerContent_open:
""
77 , togglerContent_closed:
""
78 , showOverflowOnHover:
false
79 , enableCursorHotkey:
true
81 , customHotkeyModifier:
"SHIFT"
103 paneSelector:
"."+prefix+
"north"
105 , resizerCursor:
"n-resize"
108 paneSelector:
"."+prefix+
"south"
110 , resizerCursor:
"s-resize"
113 paneSelector:
"."+prefix+
"east"
115 , resizerCursor:
"e-resize"
118 paneSelector:
"."+prefix+
"west"
120 , resizerCursor:
"w-resize"
123 paneSelector:
"."+prefix+
"center"
131 all: { duration:
"fast" }
132 , north: { direction:
"up" }
133 , south: { direction:
"down" }
134 , east: { direction:
"right"}
135 , west: { direction:
"left" }
138 all: { duration:
"slow" }
139 , north: { direction:
"up" }
140 , south: { direction:
"down" }
141 , east: { direction:
"right"}
142 , west: { direction:
"left" }
145 all: { duration:
"fast" }
152 allPanes:
"north,south,east,west,center"
153 , borderPanes:
"north,south,east,west"
184 , textAlign:
"center"
208 , border:
"1px solid #BBB"
281 id: Math.floor(Math.random() * 10000)
318 var isStr =
function (o) {
319 if (typeof o ==
"string")
321 else if (typeof o ==
"object") {
323 var match = o.constructor.toString().match(/
string/i);
324 return (match !== null);
336 var str =
function (o) {
337 if (typeof o ==
"string" || isStr(o))
return $.trim(o);
346 var min =
function (x,y) {
return Math.min(x,y); };
347 var max =
function (x,y) {
return Math.max(x,y); };
361 var transformData =
function (d) {
362 var json = { defaults:{fxSettings:{}}, north:{fxSettings:{}}, south:{fxSettings:{}}, east:{fxSettings:{}}, west:{fxSettings:{}}, center:{fxSettings:{}} };
364 if (d.effects || d.defaults || d.north || d.south || d.west || d.east || d.center)
365 json = $.extend( json, d );
368 $.each( d,
function (key,val) {
370 json[
a[1] ?
a[0] :
"defaults" ][
a[1] ?
a[1] :
a[0] ] = val;
385 var setFlowCallback =
function (action, pane, param) {
387 cb = action +
","+ pane +
","+ (param ? 1 : 0)
390 $.each(c.borderPanes.split(
","),
function (i,p) {
397 function bindCallback (p, test) {
399 if (!cP.doCallback) {
400 cP.doCallback =
true;
404 cpPane = cP.callback.split(
",")[1];
405 if (cpPane != p && cpPane != pane)
406 bindCallback (cpPane,
true);
420 var execFlowCallback =
function (pane) {
424 c.isLayoutBusy =
false;
426 if (!cP.doCallback || !cP.callback)
return;
428 cP.doCallback =
false;
432 cb = cP.callback.split(
",")
433 , param = (cb[2] > 0 ?
true :
false)
436 open( cb[1], param );
437 else if (cb[0] ==
"close")
438 close( cb[1], param );
440 if (!cP.doCallback) cP.callback = null;
451 var execUserCallback =
function (pane, v_fn) {
455 if (typeof v_fn ==
"function")
457 else if (typeof v_fn !=
"string")
459 else if (v_fn.indexOf(
",") > 0) {
462 args = v_fn.split(
",")
465 if (typeof fn==
"function" && args.length > 1)
471 if (typeof fn==
"function")
473 return fn( pane, $Ps[pane], $.
extend({},state[pane]), $.
extend({},options[pane]), options.name );
488 var cssNum =
function ($E, prop) {
494 if (!$.browser.msie) {
495 if ($.curCSS($E[0],
"display",
true) ==
"none") {
497 visibility = $.curCSS($E[0],
"visibility",
true);
498 $E.css({ display:
"block", visibility:
"hidden" });
502 val = parseInt($.curCSS($E[0], prop,
true), 10) || 0;
505 $E.css({ display:
"none" });
506 if (visibility && visibility !=
"hidden")
507 $E.css({ visibility: visibility });
525 var cssW =
function (e, outerWidth) {
537 else if (!(outerWidth>0))
538 outerWidth = isStr(e) ? getPaneSize(e) : $E.outerWidth();
545 - cssNum($E,
"paddingLeft")
546 - cssNum($E,
"paddingRight")
547 - ($.curCSS($E[0],
"borderLeftStyle",
true) ==
"none" ? 0 : cssNum($E,
"borderLeftWidth"))
548 - ($.curCSS($E[0],
"borderRightStyle",
true) ==
"none" ? 0 : cssNum($E,
"borderRightWidth"))
551 var cssH =
function (e, outerHeight) {
561 if (outerHeight <= 0)
563 else if (!(outerHeight>0))
564 outerHeight = (isStr(e)) ? getPaneSize(e) : $E.outerHeight();
571 - cssNum($E,
"paddingTop")
572 - cssNum($E,
"paddingBottom")
573 - ($.curCSS($E[0],
"borderTopStyle",
true) ==
"none" ? 0 : cssNum($E,
"borderTopWidth"))
574 - ($.curCSS($E[0],
"borderBottomStyle",
true) ==
"none" ? 0 : cssNum($E,
"borderBottomWidth"))
577 var cssSize =
function (pane, outerSize) {
578 if (c[pane].dir==
"horz")
579 return cssH(pane, outerSize);
581 return cssW(pane, outerSize);
591 var getPaneSize =
function (pane, inclSpace) {
596 , oSp = (inclSpace ? o.spacing_open : 0)
597 , cSp = (inclSpace ? o.spacing_closed : 0)
599 if (!$P || s.isHidden)
601 else if (s.isClosed || (s.isSliding && inclSpace))
603 else if (c[pane].dir ==
"horz")
604 return $P.outerHeight() + oSp;
606 return $P.outerWidth() + oSp;
609 var setPaneMinMaxSizes =
function (pane) {
612 , edge = c[pane].edge
617 , $altPane = $Ps[ altSide[pane] ]
618 , paneSpacing = o.spacing_open
619 , altPaneSpacing = options[ altSide[pane] ].spacing_open
620 , altPaneSize = (!$altPane ? 0 : (dir==
"horz" ? $altPane.outerHeight() : $altPane.outerWidth()))
621 , containerSize = (dir==
"horz" ? d.innerHeight : d.innerWidth)
623 , limitSize = containerSize - paneSpacing - altPaneSize - altPaneSpacing
624 , minSize = s.minSize || 0
625 , maxSize = Math.min(s.maxSize || 9999, limitSize)
629 case "north": minPos = d.offsetTop + minSize;
630 maxPos = d.offsetTop + maxSize;
632 case "west": minPos = d.offsetLeft + minSize;
633 maxPos = d.offsetLeft + maxSize;
635 case "south": minPos = d.offsetTop + d.innerHeight - maxSize;
636 maxPos = d.offsetTop + d.innerHeight - minSize;
638 case "east": minPos = d.offsetLeft + d.innerWidth - maxSize;
639 maxPos = d.offsetLeft + d.innerWidth - minSize;
643 $.extend(s, { minSize: minSize, maxSize: maxSize, minPosition: minPos, maxPosition: maxPos });
653 var getPaneDims =
function () {
655 top: getPaneSize(
"north",
true)
656 , bottom: getPaneSize(
"south",
true)
657 , left: getPaneSize(
"west",
true)
658 , right: getPaneSize(
"east",
true)
664 width = cDims.innerWidth - left - right;
665 height = cDims.innerHeight - bottom - top;
668 bottom += cDims.bottom;
670 right += cDims.right;
685 var getElemDims =
function ($E) {
691 $.each(
"Left,Right,Top,Bottom".split(
","),
function () {
693 b = d[
"border" +e] = cssNum($E,
"border"+e+
"Width");
694 p = d[
"padding"+e] = cssNum($E,
"padding"+e);
695 d[
"offset" +e] = b + p;
697 if ($E == $Container)
698 d[e.toLowerCase()] = ($.boxModel ? p : 0);
701 d.innerWidth = d.outerWidth = $E.outerWidth();
702 d.innerHeight = d.outerHeight = $E.outerHeight();
704 d.innerWidth -= (d.offsetLeft + d.offsetRight);
705 d.innerHeight -= (d.offsetTop + d.offsetBottom);
712 var
setTimer =
function (pane, action, fn, ms) {
714 Layout = window.layout = window.layout || {}
715 , Timers = Layout.timers = Layout.timers || {}
716 , name =
"layout_"+ state.id +
"_"+ pane +
"_"+ action
718 if (Timers[name])
return;
719 else Timers[name] = setTimeout(fn, ms);
722 var clearTimer =
function (pane, action) {
724 Layout = window.layout = window.layout || {}
725 , Timers = Layout.timers = Layout.timers || {}
726 , name =
"layout_"+ state.id +
"_"+ pane +
"_"+ action
729 clearTimeout( Timers[name] );
752 var create =
function () {
763 if (options.scrollToBookmarkOnLoad)
764 with (
self.location)
if (hash) replace( hash );
770 $(window).resize(function () {
771 var timerID =
"timerLayout_"+state.id;
772 if (window[timerID]) clearTimeout(window[timerID]);
773 window[timerID] = null;
774 if (
true || $.browser.msie)
775 window[timerID] = setTimeout(resizeAll, 100);
788 var initContainer =
function () {
790 if ($Container[0].tagName ==
"BODY") {
806 CSS = { overflow:
"hidden" }
807 , p = $Container.css(
"position")
808 , h = $Container.css(
"height")
811 if (!$Container.hasClass(
"ui-layout-pane")) {
812 if (!p ||
"fixed,absolute,relative".indexOf(p) < 0)
813 CSS.position =
"relative";
817 $Container.css( CSS );
822 cDims = state.container = getElemDims( $Container );
832 var initHotkeys =
function () {
834 $.each(c.borderPanes.split(
","),
function (i,pane) {
835 var o = options[pane];
836 if (o.enableCursorHotkey || o.customHotkey) {
837 $(document).keydown( keyDown );
850 var initOptions =
function () {
852 opts = transformData( opts );
856 $.extend( effects, opts.effects );
861 $.each(
"name,scrollToBookmarkOnLoad".split(
","),
function (idx,key) {
862 if (opts[key] !== undefined)
863 options[key] = opts[key];
864 else if (opts.defaults[key] !== undefined) {
865 options[key] = opts.defaults[key];
866 delete opts.defaults[key];
871 $.each(
"paneSelector,resizerCursor,customHotkey".split(
","),
872 function (idx,key) {
delete opts.defaults[key]; }
876 $.extend( options.defaults, opts.defaults );
881 c.center = $.extend(
true, {}, c.defaults, c.center );
882 $.extend( options.center, opts.center );
884 var o_Center = $.extend(
true, {}, options.defaults, opts.defaults, options.center );
885 $.each(
"paneClass,contentSelector,contentIgnoreSelector,applyDefaultStyles,showOverflowOnHover".split(
","),
886 function (idx,key) { options.center[key] = o_Center[key]; }
889 var defs = options.defaults;
892 $.each(c.borderPanes.split(
","),
function(i,pane) {
894 c[pane] = $.extend(
true, {}, c.defaults, c[pane] );
896 o = options[pane] = $.extend(
true, {}, options.defaults, options[pane], opts.defaults, opts[pane] );
899 if (!o.paneClass) o.paneClass = defaults.paneClass;
900 if (!o.resizerClass) o.resizerClass = defaults.resizerClass;
901 if (!o.togglerClass) o.togglerClass = defaults.togglerClass;
904 $.each([
"_open",
"_close",
""],
function (i,n) {
907 , sSpeed =
"fxSpeed"+n
908 , sSettings =
"fxSettings"+n
914 || opts.defaults[sName]
915 || opts.defaults.fxName
923 var fxName = o[sName];
924 if (fxName ==
"none" || !$.effects || !$.effects[fxName] || (!effects[fxName] && !o[sSettings] && !o.fxSettings))
925 fxName = o[sName] =
"none";
928 fx = effects[fxName] || {}
929 , fx_all = fx.all || {}
930 , fx_pane = fx[pane] || {}
933 o[sSettings] = $.extend(
937 , defs.fxSettings || {}
938 , defs[sSettings] || {}
941 , opts.defaults.fxSettings
942 , opts.defaults[sSettings] || {}
943 , opts[pane].fxSettings
944 , opts[pane][sSettings] || {}
949 || opts[pane].fxSpeed
950 || opts.defaults[sSpeed]
951 || opts.defaults.fxSpeed
953 || o[sSettings].duration
955 || o.fxSettings.duration
957 || defs.fxSettings.duration
974 var initPanes =
function () {
976 $.each(c.allPanes.split(
","),
function() {
984 , size = o.size==
"auto" || isNaN(o.size) ? 0 : o.size
985 , minSize = o.minSize || 1
986 , maxSize = o.maxSize || 9999
987 , spacing = o.spacing_open || 0
988 , sel = o.paneSelector
989 , isIE6 = ($.browser.msie && $.browser.version < 7)
995 if (sel.substr(0,1)===
"#")
997 $P = $Ps[pane] = $Container.find(sel+
":first");
999 $P = $Ps[pane] = $Container.children(sel+
":first");
1001 if (!$P.length) $P = $Ps[pane] = $Container.children(
"form:first").children(sel+
":first");
1012 .addClass( o.paneClass +
" "+ o.paneClass+
"-"+pane )
1016 if (pane !=
"center") {
1018 s.isSliding =
false;
1019 s.isResizing=
false;
1026 CSS = $.extend({ visibility:
"visible", display:
"block" }, c.defaults.cssReq, c[pane].cssReq );
1027 if (o.applyDefaultStyles) $.extend( CSS, c.defaults.cssDef, c[pane].cssDef );
1033 case "north": CSS.top = cDims.top;
1034 CSS.left = cDims.left;
1035 CSS.right = cDims.right;
1037 case "south": CSS.bottom = cDims.bottom;
1038 CSS.left = cDims.left;
1039 CSS.right = cDims.right;
1041 case "west": CSS.left = cDims.left;
1043 case "east": CSS.right = cDims.right;
1048 if (dir ==
"horz") {
1049 if (size === 0 || size ==
"auto") {
1050 $P.css({ height:
"auto" });
1051 size = $P.outerHeight();
1053 size = max(size, minSize);
1054 size = min(size, maxSize);
1055 size = min(size, cDims.innerHeight - spacing);
1056 CSS.height = max(1, cssH(pane, size));
1059 s.maxSize = maxSize;
1060 s.minSize = max(minSize, size - CSS.height + 1);
1065 else if (dir ==
"vert") {
1066 if (size === 0 || size ==
"auto") {
1067 $P.css({ width:
"auto",
float:
"left" });
1068 size = $P.outerWidth();
1069 $P.css({
float:
"none" });
1071 size = max(size, minSize);
1072 size = min(size, maxSize);
1073 size = min(size, cDims.innerWidth - spacing);
1074 CSS.width = max(1, cssW(pane, size));
1076 s.maxSize = maxSize;
1078 s.minSize = max(minSize, size - CSS.width + 1);
1080 sizeMidPanes(pane, null,
true);
1082 else if (pane ==
"center") {
1084 sizeMidPanes(
"center", null,
true);
1088 if (o.initClosed && o.closable) {
1089 $P.hide().addClass(
"closed");
1092 else if (o.initHidden || o.initClosed) {
1097 $P.addClass(
"open");
1100 if (o.showOverflowOnHover)
1101 $P.hover( allowOverflow, resetOverflow );
1106 if (o.contentSelector) {
1107 $C = $Cs[pane] = $P.children(o.contentSelector+
":first");
1112 $C.css( c.content.cssReq );
1113 if (o.applyDefaultStyles) $C.css( c.content.cssDef );
1115 $P.css({ overflow:
"hidden" });
1127 var initHandles =
function () {
1129 $.each(c.borderPanes.split(
","),
function() {
1134 , rClass = o.resizerClass
1135 , tClass = o.togglerClass
1141 if (!$P || (!o.closable && !o.resizable))
return;
1145 , isOpen = $P.is(
":visible")
1146 , spacing = (isOpen ? o.spacing_open : o.spacing_closed)
1148 , _state = (isOpen ?
"-open" :
"-closed")
1152 $R = $Rs[pane] = $(
"<span></span>");
1154 if (isOpen && o.resizable)
1156 else if (!isOpen && o.slidable)
1157 $R.attr(
"title", o.sliderTip).css(
"cursor", o.sliderCursor);
1161 .attr(
"id", (o.paneSelector.substr(0,1)==
"#" ? o.paneSelector.substr(1) +
"-resizer" :
""))
1162 .attr(
"resizer", pane)
1163 .css(c.resizers.cssReq)
1165 .css(edge, cDims[edge] + getPaneSize(pane))
1167 .addClass( rClass +
" "+ rClass+_pane +
" "+ rClass+_state +
" "+ rClass+_pane+_state )
1168 .appendTo($Container)
1171 if (o.applyDefaultStyles)
1172 $R.css(c.resizers.cssDef);
1176 $T = $Ts[pane] = $(
"<div></div>");
1179 .attr(
"id", (o.paneSelector.substr(0,1)==
"#" ? o.paneSelector.substr(1) +
"-toggler" :
""))
1180 .css(c.togglers.cssReq)
1181 .attr(
"title", (isOpen ? o.togglerTip_open : o.togglerTip_closed))
1182 .click(
function(evt){ toggle(pane); evt.stopPropagation(); })
1183 .mouseover(
function(evt){ evt.stopPropagation(); })
1185 .addClass( tClass +
" "+ tClass+_pane +
" "+ tClass+_state +
" "+ tClass+_pane+_state )
1190 if (o.togglerContent_open)
1191 $(
"<span>"+ o.togglerContent_open +
"</span>")
1192 .addClass(
"content content-open")
1193 .css(
"display", s.isClosed ?
"none" :
"block")
1196 if (o.togglerContent_closed)
1197 $(
"<span>"+ o.togglerContent_closed +
"</span>")
1198 .addClass(
"content content-closed")
1199 .css(
"display", s.isClosed ?
"block" :
"none")
1204 if (o.applyDefaultStyles)
1205 $T.css(c.togglers.cssDef);
1207 if (!isOpen) bindStartSlidingEvent(pane,
true);
1213 sizeHandles(
"all",
true);
1224 var initResizable =
function () {
1226 draggingAvailable = (typeof $.fn.draggable ==
"function")
1227 , minPosition, maxPosition, edge
1230 $.each(c.borderPanes.split(
","),
function() {
1236 if (!draggingAvailable || !$Ps[pane] || !o.resizable) {
1237 o.resizable =
false;
1242 rClass = o.resizerClass
1244 , dragClass = rClass+
"-drag"
1245 , dragPaneClass = rClass+
"-"+pane+
"-drag"
1247 , draggingClass = rClass+
"-dragging"
1248 , draggingPaneClass = rClass+
"-"+pane+
"-dragging"
1249 , draggingClassSet =
false
1256 .attr(
"title", o.resizerTip)
1257 .css(
"cursor", o.resizerCursor)
1261 containment: $Container[0]
1262 , axis: (c[pane].dir==
"horz" ?
"y" :
"x")
1267 , opacity: o.resizerDragOpacity
1269 , zIndex: c.zIndex.resizing
1271 , start: function (e, ui) {
1274 if (
false === execUserCallback(pane, o.onresize_start))
return false;
1276 s.isResizing =
true;
1277 clearTimer(pane,
"closeSlider");
1279 $R.addClass( dragClass +
" "+ dragPaneClass );
1280 draggingClassSet =
false;
1283 var resizerWidth = (pane==
"east" || pane==
"south" ? o.spacing_open : 0);
1284 setPaneMinMaxSizes(pane);
1285 s.minPosition -= resizerWidth;
1286 s.maxPosition -= resizerWidth;
1287 edge = (c[pane].dir==
"horz" ?
"top" :
"left");
1290 $(o.maskIframesOnResize ===
true ?
"iframe" : o.maskIframesOnResize).each(
function() {
1291 $(
'<div class="ui-layout-mask"/>')
1296 , position:
"absolute"
1297 , width: this.offsetWidth+
"px"
1298 , height: this.offsetHeight+
"px"
1300 .css($(
this).offset())
1301 .appendTo(this.parentNode)
1306 , drag:
function (e, ui) {
1307 if (!draggingClassSet) {
1308 $(
".ui-draggable-dragging")
1309 .addClass( draggingClass +
" "+ draggingPaneClass )
1310 .children().css(
"visibility",
"hidden")
1312 draggingClassSet =
true;
1314 if (s.isSliding) $Ps[pane].css(
"zIndex", c.zIndex.sliding);
1317 if (ui.position[edge] < s.minPosition) ui.position[edge] = s.minPosition;
1318 else if (ui.position[edge] > s.maxPosition) ui.position[edge] = s.maxPosition;
1321 , stop:
function (e, ui) {
1323 dragPos = ui.position
1327 $R.removeClass( dragClass +
" "+ dragPaneClass );
1330 case "north": resizerPos = dragPos.top;
break;
1331 case "west": resizerPos = dragPos.left;
break;
1332 case "south": resizerPos = cDims.outerHeight - dragPos.top - $R.outerHeight();
break;
1333 case "east": resizerPos = cDims.outerWidth - dragPos.left - $R.outerWidth();
break;
1336 newSize = resizerPos - cDims[ c[pane].edge ];
1338 sizePane(pane, newSize);
1341 $(
"div.ui-layout-mask").
remove();
1343 s.isResizing =
false;
1366 var hide =
function (pane, onInit) {
1373 if (!$P || s.isHidden)
return;
1376 if (
false === execUserCallback(pane, o.onhide_start))
return;
1378 s.isSliding =
false;
1382 if (onInit || s.isClosed) {
1386 sizeMidPanes(c[pane].dir ==
"horz" ?
"all" :
"center");
1387 execUserCallback(pane, o.onhide_end || o.onhide);
1396 var show =
function (pane, openPane) {
1403 if (!$P || !s.isHidden)
return;
1406 if (
false === execUserCallback(pane, o.onshow_start))
return;
1408 s.isSliding =
false;
1413 if ($R && o.spacing_open > 0) $R.show();
1414 if (openPane ===
false)
1428 var toggle =
function (pane) {
1429 var s = state[pane];
1432 else if (s.isClosed)
1445 var close =
function (pane, force, noAnimation) {
1452 , doFX = !noAnimation && !s.isClosed && (o.fxName_close !=
"none")
1453 , edge = c[pane].edge
1454 , rClass = o.resizerClass
1455 , tClass = o.togglerClass
1458 , _sliding=
"-sliding"
1459 , _closed =
"-closed"
1461 , isShowing = s.isShowing
1462 , isHiding = s.isHiding
1468 if (!$P || (!o.resizable && !o.closable))
return;
1469 else if (!force && s.isClosed && !isShowing)
return;
1471 if (c.isLayoutBusy) {
1472 setFlowCallback(
"close", pane, force);
1478 if (!isShowing &&
false === execUserCallback(pane, o.onclose_start))
return;
1481 c[pane].isMoving =
true;
1482 c.isLayoutBusy =
true;
1486 if (isHiding) s.isHidden =
true;
1487 else if (isShowing) s.isHidden =
false;
1490 syncPinBtns(pane,
false);
1493 if (!s.isSliding) sizeMidPanes(c[pane].dir ==
"horz" ?
"all" :
"center");
1498 .css(edge, cDims[edge])
1499 .removeClass( rClass+_open +
" "+ rClass+_pane+_open )
1500 .removeClass( rClass+_sliding +
" "+ rClass+_pane+_sliding )
1501 .addClass( rClass+_closed +
" "+ rClass+_pane+_closed )
1506 .draggable(
"disable")
1507 .css(
"cursor",
"default")
1513 .removeClass( tClass+_open +
" "+ tClass+_pane+_open )
1514 .addClass( tClass+_closed +
" "+ tClass+_pane+_closed )
1515 .attr(
"title", o.togglerTip_closed)
1523 lockPaneForFX(pane,
true);
1524 $P.hide( o.fxName_close, o.fxSettings_close, o.fxSpeed_close, function () {
1525 lockPaneForFX(pane,
false);
1526 if (!s.isClosed)
return;
1536 function close_2 () {
1537 bindStartSlidingEvent(pane,
true);
1540 if (!isShowing) execUserCallback(pane, o.onclose_end || o.onclose);
1542 if (isShowing) execUserCallback(pane, o.onshow_end || o.onshow);
1543 if (isHiding) execUserCallback(pane, o.onhide_end || o.onhide);
1546 execFlowCallback(pane);
1557 var open =
function (pane, slide, noAnimation) {
1564 , doFX = !noAnimation && s.isClosed && (o.fxName_open !=
"none")
1565 , edge = c[pane].edge
1566 , rClass = o.resizerClass
1567 , tClass = o.togglerClass
1570 , _closed =
"-closed"
1571 , _sliding=
"-sliding"
1573 , isShowing = s.isShowing
1578 if (!$P || (!o.resizable && !o.closable))
return;
1579 else if (!s.isClosed && !s.isSliding)
return;
1582 if (s.isHidden && !isShowing) {
1587 if (c.isLayoutBusy) {
1588 setFlowCallback(
"open", pane, slide);
1593 if (
false === execUserCallback(pane, o.onopen_start))
return;
1596 c[pane].isMoving =
true;
1597 c.isLayoutBusy =
true;
1600 if (s.isSliding && !slide)
1601 bindStopSlidingEvents(pane,
false);
1605 if (isShowing) s.isHidden =
false;
1608 setPaneMinMaxSizes(pane);
1609 if (s.size > s.maxSize)
1610 $P.css( c[pane].sizeType, max(1, cssSize(pane, s.maxSize)) );
1612 bindStartSlidingEvent(pane,
false);
1615 lockPaneForFX(pane,
true);
1616 $P.show( o.fxName_open, o.fxSettings_open, o.fxSpeed_open,
function() {
1617 lockPaneForFX(pane,
false);
1618 if (s.isClosed)
return;
1628 function open_2 () {
1631 sizeMidPanes(c[pane].dir==
"vert" ?
"center" :
"all");
1636 .css(edge, cDims[edge] + getPaneSize(pane))
1637 .removeClass( rClass+_closed +
" "+ rClass+_pane+_closed )
1638 .addClass( rClass+_open +
" "+ rClass+_pane+_open )
1639 .addClass( !s.isSliding ?
"" : rClass+_sliding +
" "+ rClass+_pane+_sliding )
1643 .draggable(
"enable")
1644 .css(
"cursor", o.resizerCursor)
1645 .attr(
"title", o.resizerTip)
1648 $R.css(
"cursor",
"default");
1652 .removeClass( tClass+_closed +
" "+ tClass+_pane+_closed )
1653 .addClass( tClass+_open +
" "+ tClass+_pane+_open )
1654 .attr(
"title", o.togglerTip_open)
1664 syncPinBtns(pane, !s.isSliding);
1667 execUserCallback(pane, o.onopen_end || o.onopen);
1670 if (isShowing) execUserCallback(pane, o.onshow_end || o.onshow);
1673 execFlowCallback(pane);
1686 var lockPaneForFX =
function (pane, doLock) {
1689 $P.css({ zIndex: c.zIndex.animation });
1691 $P.css({ top: cDims.top + cDims.innerHeight - $P.outerHeight() });
1692 else if (pane==
"east")
1693 $P.css({ left: cDims.left + cDims.innerWidth - $P.outerWidth() });
1696 if (!state[pane].isSliding) $P.css({ zIndex: c.zIndex.pane_normal });
1698 $P.css({ top:
"auto" });
1699 else if (pane==
"east")
1700 $P.css({ left:
"auto" });
1714 var bindStartSlidingEvent =
function (pane, enable) {
1718 , trigger = o.slideTrigger_open
1720 if (!$R || !o.slidable)
return;
1722 if (trigger !=
"click" && trigger !=
"dblclick" && trigger !=
"mouseover") trigger =
"click";
1725 [enable ?
"bind" :
"unbind"](trigger, slideOpen)
1727 .css(
"cursor", (enable ? o.sliderCursor:
"default"))
1728 .attr(
"title", (enable ? o.sliderTip :
""))
1743 var bindStopSlidingEvents =
function (pane, enable) {
1747 , trigger = o.slideTrigger_close
1748 , action = (enable ?
"bind" :
"unbind")
1753 s.isSliding = enable;
1754 clearTimer(pane,
"closeSlider");
1757 $P.css({ zIndex: (enable ? c.zIndex.sliding : c.zIndex.pane_normal) });
1758 $R.css({ zIndex: (enable ? c.zIndex.sliding : c.zIndex.resizer_normal) });
1761 if (trigger !=
"click" && trigger !=
"mouseout") trigger =
"mouseout";
1765 $P.bind(trigger, slideClosed );
1766 $R.bind(trigger, slideClosed );
1767 if (trigger =
"mouseout") {
1768 $P.bind(
"mouseover", cancelMouseOut );
1769 $R.bind(
"mouseover", cancelMouseOut );
1777 if (trigger =
"mouseout") {
1779 $P.unbind(
"mouseover");
1780 $R.unbind(
"mouseover");
1781 clearTimer(pane,
"closeSlider");
1786 function cancelMouseOut (evt) {
1787 clearTimer(pane,
"closeSlider");
1788 evt.stopPropagation();
1792 var slideOpen =
function () {
1793 var pane = $(
this).attr(
"resizer");
1794 if (state[pane].isClosed) {
1795 bindStopSlidingEvents(pane,
true);
1800 var slideClosed =
function () {
1803 , pane = $E.attr(
"pane") || $E.attr(
"resizer")
1807 if (s.isClosed || s.isResizing)
1809 else if (o.slideTrigger_close ==
"click")
1812 setTimer(pane,
"closeSlider", close_NOW, 300);
1815 function close_NOW () {
1816 bindStopSlidingEvents(pane,
false);
1817 if (!s.isClosed) close(pane);
1829 var sizePane =
function (pane, size) {
1840 setPaneMinMaxSizes(pane);
1842 s.minSize = max(s.minSize, o.minSize);
1843 if (o.maxSize > 0) s.maxSize = min(s.maxSize, o.maxSize);
1845 size = max(size, s.minSize);
1846 size = min(size, s.maxSize);
1850 $R.css( edge, size + cDims[edge] );
1851 $P.css( c[pane].sizeType, max(1, cssSize(pane, size)) );
1854 if (!s.isSliding) sizeMidPanes(dir==
"horz" ?
"all" :
"center");
1857 execUserCallback(pane, o.onresize_end || o.onresize);
1865 var sizeMidPanes =
function (panes, overrideDims, onInit) {
1866 if (!panes || panes ==
"all") panes =
"east,west,center";
1868 var d = getPaneDims();
1869 if (overrideDims) $.extend( d, overrideDims );
1871 $.each(panes.split(
","),
function() {
1872 if (!$Ps[
this])
return;
1883 if (pane ==
"center") {
1885 CSS = $.extend( {}, d );
1886 CSS.width = max(1, cssW(pane, CSS.width));
1887 CSS.height = max(1, cssH(pane, CSS.height));
1888 hasRoom = (CSS.width > 1 && CSS.height > 1);
1893 if ($.browser.msie && (!$.boxModel || $.browser.version < 7)) {
1894 if ($Ps.north) $Ps.north.css({ width: cssW($Ps.north, cDims.innerWidth) });
1895 if ($Ps.south) $Ps.south.css({ width: cssW($Ps.south, cDims.innerWidth) });
1900 CSS.bottom = d.bottom;
1901 CSS.height = max(1, cssH(pane, d.height));
1902 hasRoom = (CSS.height > 1);
1909 if (s.isHidden)
return;
1910 else show(pane, !s.isClosed);
1918 execUserCallback(pane, o.onresize_end || o.onresize);
1921 else if (!s.noRoom) {
1923 if (s.isHidden)
return;
1934 var sizeContent =
function (panes) {
1935 if (!panes || panes ==
"all") panes = c.allPanes;
1937 $.each(panes.split(
","),
function() {
1938 if (!$Cs[
this])
return;
1941 , ignore = options[pane].contentIgnoreSelector
1945 , height = cssH($P);
1947 $P.children().each(
function() {
1948 if (
this == e_C)
return;
1950 if (!ignore || !$E.is(ignore))
1951 height -= $E.outerHeight();
1954 height = cssH($C, height);
1958 $C.css({ height: height }).show();
1970 var sizeHandles =
function (panes, onInit) {
1971 if (!panes || panes ==
"all") panes = c.borderPanes;
1973 $.each(panes.split(
","),
function() {
1982 if (!$P || !$R || (!o.resizable && !o.closable))
return;
1986 , _state = (s.isClosed ?
"_closed" :
"_open")
1987 , spacing = o[
"spacing"+ _state]
1988 , togAlign = o[
"togglerAlign"+ _state]
1989 , togLen = o[
"togglerLength"+ _state]
1998 else if (!s.noRoom && !s.isHidden)
2002 if (dir ==
"horz") {
2003 paneLen = $P.outerWidth();
2005 width: max(1, cssW($R, paneLen))
2006 , height: max(1, cssH($R, spacing))
2007 , left: cssNum($P,
"left")
2011 paneLen = $P.outerHeight();
2013 height: max(1, cssH($R, paneLen))
2014 , width: max(1, cssW($R, spacing))
2015 , top: cDims.top + getPaneSize(
"north",
true)
2022 if (togLen == 0 || (s.isSliding && o.hideTogglerOnSlide)) {
2029 if (!(togLen > 0) || togLen ==
"100%" || togLen > paneLen) {
2034 if (typeof togAlign ==
"string") {
2037 case "left": offset = 0;
2040 case "right": offset = paneLen - togLen;
2044 default: offset = Math.floor((paneLen - togLen) / 2);
2048 var x = parseInt(togAlign);
2049 if (togAlign >= 0) offset = x;
2050 else offset = paneLen - togLen + x;
2055 $TC_o = (o.togglerContent_open ? $T.children(
".content-open") :
false)
2056 , $TC_c = (o.togglerContent_closed ? $T.children(
".content-closed") :
false)
2057 , $TC = (s.isClosed ? $TC_c : $TC_o)
2059 if ($TC_o) $TC_o.css(
"display", s.isClosed ?
"none" :
"block");
2060 if ($TC_c) $TC_c.css(
"display", s.isClosed ?
"block" :
"none");
2062 if (dir ==
"horz") {
2063 var width = cssW($T, togLen);
2065 width: max(0, width)
2066 , height: max(1, cssH($T, spacing))
2070 $TC.css(
"marginLeft", Math.floor((width-$TC.outerWidth())/2));
2073 var height = cssH($T, togLen);
2075 height: max(0, height)
2076 , width: max(1, cssW($T, spacing))
2080 $TC.css(
"marginTop", Math.floor((height-$TC.outerHeight())/2));
2087 if (onInit && o.initHidden) {
2100 var resizeAll =
function () {
2102 oldW = cDims.innerWidth
2103 , oldH = cDims.innerHeight
2105 cDims = state.container = getElemDims($Container);
2108 checkH = (cDims.innerHeight < oldH)
2109 , checkW = (cDims.innerWidth < oldW)
2113 if (checkH || checkW)
2115 $.each([
"south",
"north",
"east",
"west"],
function(i,pane) {
2118 if (!s.isClosed && ((checkH && dir==
"horz") || (checkW && dir==
"vert"))) {
2119 setPaneMinMaxSizes(pane);
2121 if (s.size > s.maxSize)
2122 sizePane(pane, s.maxSize);
2126 sizeMidPanes(
"all");
2138 function keyDown (evt) {
2139 if (!evt)
return true;
2140 var code = evt.keyCode;
2141 if (code < 33)
return true;
2150 , isCursorKey = (code >= 37 && code <= 40)
2152 , SHIFT = evt.shiftKey
2153 , CTRL = evt.ctrlKey
2158 if (!CTRL && !SHIFT)
2160 else if (isCursorKey && options[PANE[code]].enableCursorHotkey)
2163 $.each(c.borderPanes.split(
","),
function(i,p) {
2166 m = o.customHotkeyModifier;
2167 if ((SHIFT && m==
"SHIFT") || (CTRL && m==
"CTRL") || (CTRL && SHIFT)) {
2168 if (k && code == (isNaN(k) || k <= 9 ? k.toUpperCase().charCodeAt(0) : k)) {
2175 if (!pane)
return true;
2180 if (!o.enableCursorHotkey || s.isHidden || !$Ps[pane])
return true;
2183 el = evt.target || evt.srcElement;
2184 if (el && SHIFT && isCursorKey && (el.tagName==
"TEXTAREA" || (el.tagName==
"INPUT" && (code==37 || code==39))))
2191 evt.stopPropagation();
2192 evt.returnValue =
false;
2204 function allowOverflow (elem) {
2205 if (
this && this.tagName) elem =
this;
2207 if (typeof elem==
"string")
2210 if ($(elem).attr(
"pane")) $P = $(elem);
2211 else $P = $(elem).parents(
"div[pane]:first");
2213 if (!$P.length)
return;
2216 pane = $P.attr(
"pane")
2223 resetOverflow(pane);
2226 if (s.isSliding || s.isResizing || s.isClosed) {
2232 newCSS = { zIndex: (c.zIndex.pane_normal + 1) }
2234 , of = $P.css(
"overflow")
2235 , ofX = $P.css(
"overflowX")
2236 , ofY = $P.css(
"overflowY")
2239 if (of !=
"visible") {
2240 curCSS.overflow = of;
2241 newCSS.overflow =
"visible";
2243 if (ofX && ofX !=
"visible" && ofX !=
"auto") {
2244 curCSS.overflowX = ofX;
2245 newCSS.overflowX =
"visible";
2247 if (ofY && ofY !=
"visible" && ofY !=
"auto") {
2248 curCSS.overflowY = ofX;
2249 newCSS.overflowY =
"visible";
2253 s.cssSaved = curCSS;
2259 $.each(c.allPanes.split(
","),
function(i, p) {
2260 if (p != pane) resetOverflow(p);
2265 function resetOverflow (elem) {
2266 if (
this && this.tagName) elem =
this;
2268 if (typeof elem==
"string")
2271 if ($(elem).hasClass(
"ui-layout-pane")) $P = $(elem);
2272 else $P = $(elem).parents(
"div[pane]:first");
2274 if (!$P.length)
return;
2277 pane = $P.attr(
"pane")
2279 , CSS = s.cssSaved || {}
2282 if (!s.isSliding && !s.isResizing)
2283 $P.css(
"zIndex", c.zIndex.pane_normal);
2302 function getBtn(selector, pane, action) {
2305 , err =
"Error Adding Button \n\nInvalid "
2308 alert(err+
"selector: "+ selector);
2309 else if (c.borderPanes.indexOf(pane) == -1)
2310 alert(err+
"pane: "+ pane);
2312 var btn = options[pane].buttonClass +
"-"+ action;
2313 $E.addClass( btn +
" "+ btn +
"-"+ pane );
2328 function addToggleBtn (selector, pane) {
2329 var $E = getBtn(selector, pane,
"toggle");
2332 .attr(
"title", state[pane].isClosed ?
"Open" :
"Close")
2333 .click(
function (evt) {
2335 evt.stopPropagation();
2348 function addOpenBtn (selector, pane) {
2349 var $E = getBtn(selector, pane,
"open");
2352 .attr(
"title",
"Open")
2353 .click(
function (evt) {
2355 evt.stopPropagation();
2368 function addCloseBtn (selector, pane) {
2369 var $E = getBtn(selector, pane,
"close");
2372 .attr(
"title",
"Close")
2373 .click(
function (evt) {
2375 evt.stopPropagation();
2395 function addPinBtn (selector, pane) {
2396 var $E = getBtn(selector, pane,
"pin");
2398 var s = state[pane];
2399 $E.click(
function (evt) {
2400 setPinState($(
this), pane, (s.isSliding || s.isClosed));
2401 if (s.isSliding || s.isClosed) open( pane );
2403 evt.stopPropagation();
2406 setPinState ($E, pane, (!s.isClosed && !s.isSliding));
2409 c[pane].pins.push( selector );
2423 function syncPinBtns (pane, doPin) {
2424 $.each(c[pane].pins,
function (i, selector) {
2425 setPinState($(selector), pane, doPin);
2439 function setPinState ($Pin, pane, doPin) {
2440 var updown = $Pin.attr(
"pin");
2441 if (updown && doPin == (updown==
"down"))
return;
2443 root = options[pane].buttonClass
2444 , class1 = root +
"-pin"
2445 , class2 = class1 +
"-"+ pane
2446 , UP1 = class1 +
"-up"
2447 , UP2 = class2 +
"-up"
2448 , DN1 = class1 +
"-down"
2449 , DN2 = class2 +
"-down"
2452 .attr(
"pin", doPin ?
"down" :
"up")
2453 .attr(
"title", doPin ?
"Un-Pin" :
"Pin")
2454 .removeClass( doPin ? UP1 : DN1 )
2455 .removeClass( doPin ? UP2 : DN2 )
2456 .addClass( doPin ? DN1 : UP1 )
2457 .addClass( doPin ? DN2 : UP2 )
2470 $Container = $(
this).css({ overflow:
"hidden" })
2477 , cDims = state.container
2493 , resizeContent: sizeContent
2494 , sizePane: sizePane
2495 , resizeAll: resizeAll
2496 , addToggleBtn: addToggleBtn
2497 , addOpenBtn: addOpenBtn
2498 , addCloseBtn: addCloseBtn
2499 , addPinBtn: addPinBtn
2500 , allowOverflow: allowOverflow
2501 , resetOverflow: resetOverflow