Commit f1da288276b957a2ba27802150e4db313d1affe0
1 parent
5cd97326
AdamImagesBug
Showing
3 changed files
with
2423 additions
and
2424 deletions
400-SOURCECODE/AIAHTML5.Web/app/controllers/AIController.js
@@ -631,7 +631,7 @@ function ($scope, $window, $rootScope, $compile, $http, log, $location, $timeout | @@ -631,7 +631,7 @@ function ($scope, $window, $rootScope, $compile, $http, log, $location, $timeout | ||
631 | title: $rootScope.getLocalStorageValue("currentViewTitle"), | 631 | title: $rootScope.getLocalStorageValue("currentViewTitle"), |
632 | position: { | 632 | position: { |
633 | top: 70, | 633 | top: 70, |
634 | - left: 20, | 634 | + left: 2, |
635 | }, | 635 | }, |
636 | 636 | ||
637 | size: { width: $(window).outerWidth() - 20, height: $(window).outerHeight() - 110 }, | 637 | size: { width: $(window).outerWidth() - 20, height: $(window).outerHeight() - 110 }, |
400-SOURCECODE/AIAHTML5.Web/app/controllers/HomeController.js
@@ -5426,9 +5426,7 @@ function ($rootScope, $scope, Modules, $log, $location, $timeout, DataService, A | @@ -5426,9 +5426,7 @@ function ($rootScope, $scope, Modules, $log, $location, $timeout, DataService, A | ||
5426 | imageToPrint.src = dataURL; | 5426 | imageToPrint.src = dataURL; |
5427 | 5427 | ||
5428 | OpenJSPanel(); // open jsPanel here | 5428 | OpenJSPanel(); // open jsPanel here |
5429 | - if ($('#jsPanel-1').length > 0) { | ||
5430 | - $('.jsPanel-btn-norm').attr('style', 'display: block'); | ||
5431 | - } | 5429 | + |
5432 | 5430 | ||
5433 | console.log('jsPanel loaded exist= ' + document.getElementById('jsPanel-1')); // document.getElementsByClassName('ppImagePanel')); | 5431 | console.log('jsPanel loaded exist= ' + document.getElementById('jsPanel-1')); // document.getElementsByClassName('ppImagePanel')); |
5434 | 5432 | ||
@@ -5476,7 +5474,7 @@ function ($rootScope, $scope, Modules, $log, $location, $timeout, DataService, A | @@ -5476,7 +5474,7 @@ function ($rootScope, $scope, Modules, $log, $location, $timeout, DataService, A | ||
5476 | $("#canvas").css("display", "none"); | 5474 | $("#canvas").css("display", "none"); |
5477 | } | 5475 | } |
5478 | $(".currentyear").html($rootScope.current_year); | 5476 | $(".currentyear").html($rootScope.current_year); |
5479 | - }, 320); | 5477 | + }, 520); |
5480 | } | 5478 | } |
5481 | 5479 | ||
5482 | } | 5480 | } |
400-SOURCECODE/AIAHTML5.Web/libs/jquery/jquery_plugin/jsPanel/jspanel/jquery.jspanel.js
1 | -/// <reference path="../vendor/mobile-detect.js" /> | ||
2 | -/// <reference path="../../../../../index.html" /> | ||
3 | -/// <reference path="../../../../../index.html" /> | ||
4 | -/* global console, MobileDetect, jQuery */ | ||
5 | -/* jQuery Plugin jsPanel | ||
6 | - Dependencies: | ||
7 | - jQuery library ( > 1.9.1 incl. 2.1.3 ) | ||
8 | - jQuery.UI library ( > 1.9.2 ) - (at least UI Core, Mouse, Widget, Draggable, Resizable) | ||
9 | - HTML5/CSS3 compatible browser | ||
10 | - | ||
11 | - Copyright (c) 2014-15 Stefan Sträßer, <http://stefanstraesser.eu/> | ||
12 | - | ||
13 | - Permission is hereby granted, free of charge, to any person obtaining a copy | ||
14 | - of this software and associated documentation files (the "Software"), to deal | ||
15 | - in the Software without restriction, including without limitation the rights | ||
16 | - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
17 | - copies of the Software, and to permit persons to whom the Software is | ||
18 | - furnished to do so, subject to the following conditions: | ||
19 | - | ||
20 | - The above copyright notice and this permission notice shall be included in | ||
21 | - all copies or substantial portions of the Software. | ||
22 | - | ||
23 | - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
24 | - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
25 | - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
26 | - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
27 | - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
28 | - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
29 | - THE SOFTWARE. | ||
30 | - | ||
31 | - <http://opensource.org/licenses/MIT>. | ||
32 | - | ||
33 | - CHANGES IN 2.6.0: | ||
34 | - + new options onbeforeclose, onclosed | ||
35 | - + new options onbeforemaximize, onmaximized | ||
36 | - + new options onbeforeminimize, onminimized | ||
37 | - + new options onbefornormalize, onnormalized | ||
38 | - */ | ||
39 | - | ||
40 | -"use strict"; | ||
41 | -// check for jQuery and jQuery UI components | ||
42 | -if (!$.fn.jquery || !$.fn.uniqueId || !$.widget || !$.ui.mouse || !$.ui.draggable || !$.ui.resizable) { | ||
43 | - console.log("Error: jQuery or at least one jQuery UI component is not loaded! You need at least jQuery 1.9.1 and jQuery UI 1.9.2 (modules Core, Mouse, Widget, Draggable and Resizable)."); | ||
44 | -} else { | ||
45 | - console.log("Loaded: jQuery " + $.fn.jquery + ", jQuery UI " + $.ui.version + | ||
46 | - "\nUI core: " + $.isFunction($.fn.uniqueId) + ", UI widget: " + $.isFunction($.widget) + ", UI mouse: " + $.isFunction($.ui.mouse) + | ||
47 | - ", UI draggable: " + $.isFunction($.ui.draggable) + ", UI resizable: " + $.isFunction($.ui.resizable)); | ||
48 | -} | ||
49 | - | ||
50 | -var jsPanel = { | ||
51 | - | ||
52 | - version: '2.6.0 2015-12-04 14:15', | ||
53 | - device: (function () { | ||
54 | - try { | ||
55 | - var imported = document.createElement('script'); | ||
56 | - //imported.src = '//vendor/mobile-detect.js'; | ||
57 | - imported.src = '~/../libs/jquery/jquery_plugin/jsPanel/vendor/mobile-detect.js'; | ||
58 | - document.head.appendChild(imported); | ||
59 | - | ||
60 | - // requires "mobile-detect.js" to be loaded | ||
61 | - var md = new MobileDetect(window.navigator.userAgent), | ||
62 | - mobile = md.mobile(), | ||
63 | - phone = md.phone(), | ||
64 | - tablet = md.tablet(), | ||
65 | - os = md.os(), | ||
66 | - userAgent = md.userAgent(); | ||
67 | - return { mobile: mobile, tablet: tablet, phone: phone, os: os, userAgent: userAgent }; | ||
68 | - } catch (e) { | ||
69 | - console.log(e + "; Seems like mobile-detect.js is not loaded"); | ||
70 | - return { mobile: undefined, tablet: undefined, phone: undefined, os: undefined, userAgent: undefined }; | ||
71 | - } | ||
72 | - })(), | ||
73 | - ID: 0, // kind of a counter to add to automatically generated id attribute | ||
74 | - widthForMinimized: 180, // default width of minimized panels | ||
75 | - template: '<div class="jsPanel jsPanel-theme-default jsPanel-state-initialized">' + | ||
76 | - '<div class="jsPanel-hdr jsPanel-theme-default">' + | ||
77 | - '<h3 class="jsPanel-title"></h3>' + | ||
78 | - '<div class="jsPanel-hdr-r">' + | ||
79 | - '<div class="jsPanel-btn-close "><span class="jsglyph jsglyph-remove"></span></div>' + | ||
80 | - '<div class="jsPanel-btn-max"><span class="jsglyph jsglyph-maximize"></span></div>' + | ||
81 | - '<div class="jsPanel-btn-norm"><span class="jsglyph jsglyph-normalize"></span></div>' + | ||
82 | - '<div class="jsPanel-btn-min"><span id="minSpan" class="fa fa-minus"></span></div>' + | ||
83 | - | ||
84 | - //'<div class="jsPanel-btn-min"><span class="jsglyph jsglyph-minimize"></span></div>' + | ||
85 | - //'<div class="jsPanel-btn-small"><span class="jsglyph jsglyph-chevron-up"></span></div>' + | ||
86 | - //'<div class="jsPanel-btn-smallrev"><span class="jsglyph jsglyph-chevron-down"></span></div>' + | ||
87 | - '</div>' + | ||
88 | - '<div class="jsPanel-hdr-toolbar jsPanel-clearfix"></div>' + | ||
89 | - '</div>' + | ||
90 | - '<div class="jsPanel-content jsPanel-theme-default"></div>' + | ||
91 | - '<div class="jsPanel-ftr jsPanel-theme-default jsPanel-clearfix"></div>' + | ||
92 | - '</div>', | ||
93 | - | ||
94 | - // add toolbar | ||
95 | - addToolbar: function (panel, place, items) { | ||
96 | - if (place === 'header') { | ||
97 | - this.configToolbar(items, panel.header.toolbar, panel); | ||
98 | - } else if (place === 'footer') { | ||
99 | - panel.footer.css({ display: 'block' }); | ||
100 | - this.configToolbar(items, panel.footer, panel); | ||
101 | - } | ||
102 | - // give toolbar the same font-family as title | ||
103 | - panel.header.toolbar.css("font-family", panel.header.title.css("font-family")); | ||
104 | - return panel; | ||
105 | - }, | ||
106 | - | ||
107 | - // loads content using jQuery.ajax(); | ||
108 | - ajax: function (panel) { | ||
109 | - var oAjax = panel.option.ajax, | ||
110 | - pc = panel.content; | ||
111 | - $.ajax(oAjax) | ||
112 | - .done(function (data, textStatus, jqXHR) { | ||
113 | - if (oAjax.autoload && oAjax.url) { | ||
114 | - pc.empty().append(data); | ||
115 | - } | ||
116 | - if ($.isFunction(oAjax.done)) { | ||
117 | - oAjax.done.call(pc, data, textStatus, jqXHR, panel); | ||
118 | - } | ||
119 | - }) | ||
120 | - .fail(function (jqXHR, textStatus, errorThrown) { | ||
121 | - if ($.isFunction(oAjax.fail)) { | ||
122 | - oAjax.fail.call(pc, jqXHR, textStatus, errorThrown, panel); | ||
123 | - } | ||
124 | - }) | ||
125 | - .always(function (arg1, textStatus, arg3) { | ||
126 | - //In response to a successful request, the function's arguments are the same as those of .done(): data(hier: arg1), textStatus, and the jqXHR object(hier: arg3) | ||
127 | - //For failed requests the arguments are the same as those of .fail(): the jqXHR object(hier: arg1), textStatus, and errorThrown(hier: arg3) | ||
128 | - // fix for a bug in jQuery-UI draggable? that causes the jsPanel to reduce width when dragged beyond boundary of containing element and option.size.width is 'auto' | ||
129 | - pc.css('width', function () { | ||
130 | - return pc.outerWidth(); | ||
131 | - }); | ||
132 | - if ($.isFunction(oAjax.always)) { | ||
133 | - oAjax.always.call(pc, arg1, textStatus, arg3, panel); | ||
134 | - } | ||
135 | - // title h3 might be to small: load() is async! | ||
136 | - jsPanel.resizeTitle(panel); | ||
137 | - // update option.size (content might come delayed) | ||
138 | - jsPanel.updateOptionSize(panel, panel.option.size); | ||
139 | - }) | ||
140 | - .then(function (data, textStatus, jqXHR) { | ||
141 | - if (oAjax.then && $.isArray(oAjax.then)) { | ||
142 | - if ($.isFunction(oAjax.then[0])) { | ||
143 | - oAjax.then[0].call(pc, data, textStatus, jqXHR, panel); | ||
144 | - } | ||
145 | - // title h3 might be to small: load() is async! | ||
146 | - jsPanel.resizeTitle(panel); | ||
147 | - // update option.size (content might come delayed) | ||
148 | - jsPanel.updateOptionSize(panel, panel.option.size); | ||
149 | - } | ||
150 | - }, function (jqXHR, textStatus, errorThrown) { | ||
151 | - if (oAjax.then && $.isArray(oAjax.then)) { | ||
152 | - if ($.isFunction(oAjax.then[1])) { | ||
153 | - oAjax.then[1].call(pc, jqXHR, textStatus, errorThrown, panel); | ||
154 | - } | ||
155 | - // title h3 might be to small: load() is async! | ||
156 | - jsPanel.resizeTitle(panel); | ||
157 | - } | ||
158 | - } | ||
159 | - ); | ||
160 | - panel.data("ajaxURL", oAjax.url); // needed for exportPanels() | ||
161 | - }, | ||
162 | - | ||
163 | - // used in option.autoclose and checks prior use of .close() whether the panel is still there | ||
164 | - autoclose: function (panel) { | ||
165 | - window.setTimeout(function () { | ||
166 | - if (panel) { | ||
167 | - panel.fadeOut('slow', function () { | ||
168 | - panel.close(); | ||
169 | - }); | ||
170 | - } | ||
171 | - }, panel.option.autoclose); | ||
172 | - }, | ||
173 | - | ||
174 | - calcPanelposition: function (jsP) { | ||
175 | - // when using option.size = 'auto' and option.position = 'center' consider use of option.ajax with | ||
176 | - // async: false -> size will be known when position is calculated | ||
177 | - // value "center" not allowed for option.position.bottom & option.position.right -> use top and/or left | ||
178 | - var panelpos = {}; | ||
179 | - // get px values for panel size in case option.size is 'auto' - results will be incorrect whenever content | ||
180 | - // is not loaded yet ( e.g. option.load, option.ajax ) -> centering can't work correctly | ||
181 | - jsP.option.size.width = $(jsP).outerWidth(); | ||
182 | - jsP.option.size.height = $(jsP).innerHeight(); | ||
183 | - // delete option.position.top and/or left if option.position.bottom and/or right (top & left values come from defaults object) | ||
184 | - if (jsP.option.position.bottom) { | ||
185 | - delete jsP.option.position.top; | ||
186 | - } | ||
187 | - if (jsP.option.position.right) { | ||
188 | - delete jsP.option.position.left; | ||
189 | - } | ||
190 | - // calculate top | bottom values != center | ||
191 | - // if not checked for 0 as well code would not be executed! | ||
192 | - if (jsP.option.position.bottom || jsP.option.position.bottom === 0) { | ||
193 | - this.calcPos('bottom', jsP); | ||
194 | - } else if (jsP.option.position.top || jsP.option.position.top === 0) { | ||
195 | - if (jsP.option.position.top === 'center') { | ||
196 | - jsP.option.position.top = this.calcPosCenter(jsP.option).top; | ||
197 | - } else { | ||
198 | - panelpos.top = this.calcPos('top', jsP); // change in 2.5.4 | ||
199 | - } | ||
200 | - } | ||
201 | - // calculate left | right values != center | ||
202 | - if (jsP.option.position.right || jsP.option.position.right === 0) { | ||
203 | - this.calcPos('right', jsP); | ||
204 | - } else if (jsP.option.position.left || jsP.option.position.left === 0) { | ||
205 | - if (jsP.option.position.left === 'center') { | ||
206 | - jsP.option.position.left = this.calcPosCenter(jsP.option).left; | ||
207 | - } else { | ||
208 | - panelpos.left = this.calcPos('left', jsP); // change in 2.5.4 | ||
209 | - } | ||
210 | - } | ||
211 | - if (jsP.option.position.top) { | ||
212 | - panelpos.top = parseInt(jsP.option.position.top, 10) + jsP.option.offset.top; | ||
213 | - } else { | ||
214 | - panelpos.bottom = parseInt(jsP.option.position.bottom, 10) + jsP.option.offset.top; | ||
215 | - } | ||
216 | - if (jsP.option.position.left) { | ||
217 | - panelpos.left = parseInt(jsP.option.position.left, 10) + jsP.option.offset.left; | ||
218 | - } else { | ||
219 | - panelpos.right = parseInt(jsP.option.position.right, 10) + jsP.option.offset.left; | ||
220 | - } | ||
221 | - jsP.css(panelpos); | ||
222 | - jsP.option.position = { | ||
223 | - top: jsP.css('top'), | ||
224 | - left: jsP.css('left') | ||
225 | - }; | ||
226 | - }, | ||
227 | - | ||
228 | - // used in calcPanelposition | ||
229 | - calcPos: function (prop, panel) { | ||
230 | - var optPosition = panel.option.position; | ||
231 | - if (optPosition[prop] === 'auto') { | ||
232 | - panel.option.position[prop] = panel.count * 30; | ||
233 | - } else if ($.isFunction(optPosition[prop])) { | ||
234 | - panel.option.position[prop] = optPosition[prop](panel); | ||
235 | - } else if (optPosition[prop] === 0) { | ||
236 | - panel.option.position[prop] = '0'; | ||
237 | - } else { | ||
238 | - panel.option.position[prop] = parseInt(optPosition[prop], 10); | ||
239 | - } | ||
240 | - // corrections if jsPanel is appended to the body element | ||
241 | - if (panel.option.selector === 'body') { | ||
242 | - if (prop === 'top') { | ||
243 | - panel.option.position.top = parseInt(optPosition.top, 10) + $(window).scrollTop(); | ||
244 | - } else if (prop === 'bottom') { | ||
245 | - panel.option.position.bottom = parseInt(optPosition.bottom, 10) - $(window).scrollTop(); | ||
246 | - } else if (prop === 'left') { | ||
247 | - panel.option.position.left = parseInt(optPosition.left, 10) + $(window).scrollLeft(); | ||
248 | - } else if (prop === 'right') { | ||
249 | - panel.option.position.right = parseInt(optPosition.right, 10) - $(window).scrollLeft(); | ||
250 | - } | ||
251 | - } | ||
252 | - return panel.option.position[prop]; | ||
253 | - }, | ||
254 | - | ||
255 | - // calculate position center for option.position == 'center' | ||
256 | - calcPosCenter: function (option) { | ||
257 | - var optSelector = option.selector, | ||
258 | - optSize = option.size, | ||
259 | - posL = ($(optSelector).outerWidth() / 2) - ((parseInt(optSize.width, 10) / 2)), | ||
260 | - posT; | ||
261 | - if (optSelector === 'body') { | ||
262 | - posT = ($(window).outerHeight() / 2) - ((parseInt(optSize.height, 10) / 2) - $(window).scrollTop()); | ||
263 | - } else { | ||
264 | - posT = ($(optSelector).outerHeight() / 2) - ((parseInt(optSize.height, 10) / 2)); | ||
265 | - } | ||
266 | - return { top: posT, left: posL }; | ||
267 | - }, | ||
268 | - | ||
269 | - // calculate position for maximized panels using option.controls.maxtoScreen (for devmondo) | ||
270 | - calcPosmaxtoScreen: function (panel) { | ||
271 | - var offset = panel.offset(); | ||
272 | - return { | ||
273 | - top: parseInt(panel.css('top')) - (offset.top - $(document).scrollTop()) + 5, | ||
274 | - left: parseInt(panel.css('left')) - (offset.left - $(document).scrollLeft()) + 5 | ||
275 | - }; | ||
276 | - }, | ||
277 | - | ||
278 | - // calculates css left for tooltips | ||
279 | - calcPosTooltipLeft: function (jsPparent, option) { | ||
280 | - // width of element serving as trigger for the tooltip | ||
281 | - var parW = jsPparent.outerWidth(), | ||
282 | - // check possible margins of trigger | ||
283 | - mL = parseInt(jsPparent.css('margin-left')), | ||
284 | - // check whether offset is set | ||
285 | - oX = option.offset.left || 0, | ||
286 | - optptPosition = option.paneltype.position; | ||
287 | - if (optptPosition === 'top' || optptPosition === 'bottom') { | ||
288 | - return (parW - option.size.width) / 2 + mL + oX; | ||
289 | - } else if (optptPosition === 'left') { | ||
290 | - return -(option.size.width) + mL + oX; | ||
291 | - } else if (optptPosition === 'right') { | ||
292 | - return parW + mL + oX; | ||
293 | - } | ||
294 | - return false; | ||
295 | - }, | ||
296 | - | ||
297 | - // calculates css top for tooltips | ||
298 | - calcPosTooltipTop: function (jsPparent, option) { | ||
299 | - var parH = jsPparent.innerHeight(), | ||
300 | - mT = parseInt(jsPparent.css('margin-top')), | ||
301 | - oY = option.offset.top || 0, | ||
302 | - optptPosition = option.paneltype.position; | ||
303 | - if (optptPosition === 'left' || optptPosition === 'right') { | ||
304 | - return -(option.size.height / 2) + (parH / 2) + mT + oY; | ||
305 | - } else if (optptPosition === 'top') { | ||
306 | - return -(option.size.height + oY) + mT; | ||
307 | - } else if (optptPosition === 'bottom') { | ||
308 | - return parH + mT + oY; | ||
309 | - } | ||
310 | - return false; | ||
311 | - }, | ||
312 | - | ||
313 | - // calculate final tooltip position | ||
314 | - calcToooltipPosition: function (jsPparent, option) { | ||
315 | - return { | ||
316 | - top: this.calcPosTooltipTop(jsPparent, option), | ||
317 | - left: this.calcPosTooltipLeft(jsPparent, option) | ||
318 | - }; | ||
319 | - }, | ||
320 | - | ||
321 | - calcVerticalOffset: function (panel) { | ||
322 | - return Math.floor(panel.offset().top - $(window).scrollTop()); | ||
323 | - }, | ||
324 | - | ||
325 | - // closes a jsPanel and removes it from the DOM | ||
326 | - close: function (panel) { | ||
327 | - // alert('jspanel closed') | ||
328 | - // get parent-element of jsPanel | ||
329 | - var context = panel.parent(), | ||
330 | - panelID = panel.attr('id'); | ||
331 | - panel.trigger('jspanelbeforeclose', panelID); | ||
332 | - if ($.isFunction(panel.option.onbeforeclose)) { | ||
333 | - var close = panel.option.onbeforeclose.call(panel, panel); | ||
334 | - if (close === false) { | ||
335 | - return panel; | ||
336 | - } | ||
337 | - } | ||
338 | - // delete childpanels ... | ||
339 | - this.closeChildpanels(panel); | ||
340 | - // if present remove tooltip wrapper | ||
341 | - if (context.hasClass('jsPanel-tooltip-wrapper')) { | ||
342 | - panel.unwrap(); | ||
343 | - } | ||
344 | - // remove the jsPanel itself | ||
345 | - panel.remove(); | ||
346 | - $('body').trigger('jspanelclosed', panelID); | ||
347 | - // remove backdrop only when modal jsPanel is closed | ||
348 | - if (panel.option.paneltype.type === 'modal') { | ||
349 | - $('.jsPanel-backdrop').remove(); | ||
350 | - } | ||
351 | - // reposition minimized panels | ||
352 | - this.reposMinimized(this.widthForMinimized); | ||
353 | - // reposition hints | ||
354 | - if (panel.option.paneltype.type === 'hint') { | ||
355 | - if (panel.hasClass("jsPanel-hint-tl")) { | ||
356 | - jsPanel.reposHints("jsPanel-hint-tl", panel.parentElmtTagname); | ||
357 | - } else if (panel.hasClass("jsPanel-hint-tc")) { | ||
358 | - jsPanel.reposHints("jsPanel-hint-tc", panel.parentElmtTagname); | ||
359 | - } else if (panel.hasClass("jsPanel-hint-tr")) { | ||
360 | - jsPanel.reposHints("jsPanel-hint-tr", panel.parentElmtTagname); | ||
361 | - } | ||
362 | - } | ||
363 | - if ($.isFunction(panel.option.onclosed)) { | ||
364 | - panel.option.onclosed.call(panel, panel); | ||
365 | - } | ||
366 | - return context; | ||
367 | - }, | ||
368 | - | ||
369 | - // close all tooltips | ||
370 | - closeallTooltips: function () { | ||
371 | - $('.jsPanel-tt').each(function () { | ||
372 | - // remove tooltip wrapper and than remove tooltip | ||
373 | - $(this).unwrap().remove(); | ||
374 | - $('body').trigger('jspanelclosed', $(this).attr('id')); | ||
375 | - }); | ||
376 | - }, | ||
377 | - | ||
378 | - // closes/removes all childpanels within the parent jsPanel | ||
379 | - closeChildpanels: function (panel) { | ||
380 | - $('.jsPanel', panel).each(function () { | ||
381 | - panel.trigger('jspanelbeforeclose', $(this).attr('id')); | ||
382 | - $(this).remove(); | ||
383 | - $('body').trigger('jspanelclosed', $(this).attr('id')); | ||
384 | - }); | ||
385 | - return panel; | ||
386 | - }, | ||
387 | - | ||
388 | - // configure controls | ||
389 | - configControls: function (panel) { | ||
390 | - var controls = ["close", "maximize", "minimize", "normalize", "smallify"]; | ||
391 | - if (panel.option.controls.buttons === 'closeonly') { | ||
392 | - $("div:not('.jsPanel-btn-close')", panel.header.controls).remove(); // change in 2.5.3 | ||
393 | - panel.header.title.css("width", "calc(100% - 30px)"); | ||
394 | - } else if (panel.option.controls.buttons === 'none') { | ||
395 | - $('*', panel.header.controls).remove(); | ||
396 | - panel.header.title.css("width", "100%"); | ||
397 | - } | ||
398 | - // disable controls individually | ||
399 | - controls.forEach(function (ctrl) { | ||
400 | - if (panel.option.controls[ctrl]) { panel.control('disable', ctrl); } | ||
401 | - }); | ||
402 | - }, | ||
403 | - | ||
404 | - // configure iconfonts | ||
405 | - configIconfont: function (panel) { | ||
406 | - var controlsArray = ["close", "max", "norm", "min", "small", "smallrev"], | ||
407 | - bootstrapArray = ["remove", "fullscreen", "resize-full", "minus", "chevron-up", "chevron-down"], | ||
408 | - fontawesomeArray = ["times", "arrows-alt", "expand", "minus", "chevron-up", "chevron-down"], | ||
409 | - optIconfont = panel.option.controls.iconfont, | ||
410 | - controls = panel.header.controls; | ||
411 | - // remove icon sprites | ||
412 | - $('*', controls).css('background-image', 'none'); | ||
413 | - // set icons | ||
414 | - if (optIconfont === 'bootstrap') { | ||
415 | - controlsArray.forEach(function (item, i) { | ||
416 | - $('.jsPanel-btn-' + item, controls).empty().append('<span class="glyphicon glyphicon-' + bootstrapArray[i] + '"></span>'); | ||
417 | - }); | ||
418 | - } else if (optIconfont === 'font-awesome') { | ||
419 | - controlsArray.forEach(function (item, i) { | ||
420 | - $('.jsPanel-btn-' + item, controls).empty().append('<span class="fa fa-' + fontawesomeArray[i] + '"></span>'); | ||
421 | - }); | ||
422 | - } | ||
423 | - }, | ||
424 | - | ||
425 | - // builds toolbar | ||
426 | - configToolbar: function (toolbaritems, toolbarplace, panel) { | ||
427 | - var el; | ||
428 | - toolbaritems.forEach(function (item) { | ||
429 | - if (typeof item === "object") { | ||
430 | - el = $(item.item); | ||
431 | - // add text to button | ||
432 | - if (typeof item.btntext === 'string') { | ||
433 | - el.append(item.btntext); | ||
434 | - } | ||
435 | - // add class to button | ||
436 | - if (typeof item.btnclass === 'string') { | ||
437 | - el.addClass(item.btnclass); | ||
438 | - } | ||
439 | - toolbarplace.append(el); | ||
440 | - // bind handler to the item | ||
441 | - if ($.isFunction(item.callback)) { | ||
442 | - el.on(item.event, panel, item.callback); | ||
443 | - // jsP is accessible in the handler as "event.data" | ||
444 | - } | ||
445 | - } | ||
446 | - }); | ||
447 | - }, | ||
448 | - | ||
449 | - // disable/enable individual controls | ||
450 | - control: function (panel, action, btn) { | ||
451 | - var controls = panel.header.controls, | ||
452 | - controlbtn; | ||
453 | - if (arguments.length === 3) { | ||
454 | - if (arguments[1] === 'disable') { | ||
455 | - if (btn === 'close') { | ||
456 | - controlbtn = $('.jsPanel-btn-close', controls); | ||
457 | - } else if (btn === 'maximize') { | ||
458 | - controlbtn = $('.jsPanel-btn-max', controls); | ||
459 | - } else if (btn === 'minimize') { | ||
460 | - controlbtn = $('.jsPanel-btn-min', controls); | ||
461 | - } else if (btn === 'normalize') { | ||
462 | - controlbtn = $('.jsPanel-btn-norm', controls); | ||
463 | - } else if (btn === 'smallify') { | ||
464 | - controlbtn = $('.jsPanel-btn-small', controls); | ||
465 | - } | ||
466 | - // unbind handler and set styles | ||
467 | - controlbtn.off().css({ opacity: 0.5, cursor: 'default' }); | ||
468 | - } else if (arguments[1] === 'enable') { | ||
469 | - if (btn === 'close') { | ||
470 | - controlbtn = $('.jsPanel-btn-close', controls); | ||
471 | - } else if (btn === 'maximize') { | ||
472 | - controlbtn = $('.jsPanel-btn-max', controls); | ||
473 | - } else if (btn === 'minimize') { | ||
474 | - controlbtn = $('.jsPanel-btn-min', controls); | ||
475 | - } else if (btn === 'normalize') { | ||
476 | - controlbtn = $('.jsPanel-btn-norm', controls); | ||
477 | - } else if (btn === 'smallify') { | ||
478 | - controlbtn = $('.jsPanel-btn-small', controls); | ||
479 | - } | ||
480 | - // enable control and reset styles | ||
481 | - controlbtn.on('click', function (e) { | ||
482 | - e.preventDefault(); | ||
483 | - panel[btn](); | ||
484 | - }).css({ opacity: 1, cursor: 'pointer' }); | ||
485 | - } | ||
486 | - } | ||
487 | - return panel; | ||
488 | - }, | ||
489 | - | ||
490 | - // helper function for the doubleclick handlers (title, content, footer) | ||
491 | - dblclickhelper: function (odcs, panel) { | ||
492 | - if (typeof odcs === 'string') { | ||
493 | - if (odcs === "maximize" || odcs === "normalize") { | ||
494 | - if (panel.status === "normalized" || panel.option.panelstatus === "normalized") { | ||
495 | - panel.maximize(); | ||
496 | - } else { | ||
497 | - panel.normalize(); | ||
498 | - } | ||
499 | - } else if (odcs === "minimize" || odcs === "smallify" || odcs === "close") { | ||
500 | - panel[odcs](); | ||
501 | - } | ||
502 | - } | ||
503 | - }, | ||
504 | - | ||
505 | - // export a panel layout to localStorage and returns array with an object for each panel | ||
506 | - exportPanels: function () { | ||
507 | - var elmtOffset, elmtPosition, elmtTop, elmtLeft, elmtWidth, elmtHeight, elmtStatus, panelParent, | ||
508 | - panelArr = [], exportedPanel, | ||
509 | - panels = $(".jsPanel").not(".jsPanel-tt, .jsPanel-hint, .jsPanel-modal"); | ||
510 | - panels.each(function (index, elmt) { | ||
511 | - exportedPanel = { | ||
512 | - panelstatus: $(elmt).data("panelstatus"), | ||
513 | - id: $(elmt).prop("id"), | ||
514 | - title: $(".jsPanel-title", elmt).html(), | ||
515 | - custom: $(elmt).data("custom"), | ||
516 | - offset: { top: 0, left: 0 }, | ||
517 | - content: $(elmt).data("content") | ||
518 | - }; | ||
519 | - // normalize minimized/maximized panels before export | ||
520 | - // status to restore is saved in exportedPanel.panelstatus | ||
521 | - if ($(elmt).data("panelstatus") !== "normalized") { | ||
522 | - $(".jsPanel-btn-norm", elmt).trigger("click"); | ||
523 | - } | ||
524 | - panelParent = $(elmt).data("selector"); | ||
525 | - elmtOffset = $(elmt).offset(); | ||
526 | - elmtPosition = $(elmt).position(); | ||
527 | - if (elmtStatus === "minimized") { | ||
528 | - if (panelParent.toLowerCase() === "body") { | ||
529 | - elmtTop = $(elmt).data("paneltop") - $(window).scrollTop() + "px"; | ||
530 | - elmtLeft = $(elmt).data("panelleft") - $(window).scrollLeft() + "px"; | ||
531 | - } else { | ||
532 | - elmtTop = $(elmt).data("paneltop") + "px"; | ||
533 | - elmtLeft = $(elmt).data("panelleft") + "px"; | ||
534 | - } | ||
535 | - elmtWidth = $(elmt).data("panelwidth") + "px"; | ||
536 | - elmtHeight = $(elmt).data("panelheight") + "px"; | ||
537 | - } else { | ||
538 | - if (panelParent.toLowerCase() === "body") { | ||
539 | - elmtTop = Math.floor(elmtOffset.top - $(window).scrollTop()) + "px"; | ||
540 | - elmtLeft = Math.floor(elmtOffset.left - $(window).scrollLeft()) + "px"; | ||
541 | - } else { | ||
542 | - elmtTop = Math.floor(elmtPosition.top) + "px"; | ||
543 | - elmtLeft = Math.floor(elmtPosition.left) + "px"; | ||
544 | - } | ||
545 | - elmtWidth = $(elmt).css("width"); | ||
546 | - elmtHeight = $(".jsPanel-content", elmt).css("height"); | ||
547 | - } | ||
548 | - exportedPanel.size = { | ||
549 | - width: elmtWidth, | ||
550 | - height: elmtHeight | ||
551 | - }; | ||
552 | - exportedPanel.position = { | ||
553 | - top: elmtTop, | ||
554 | - left: elmtLeft | ||
555 | - }; | ||
556 | - if ($(elmt).data("loadURL")) { | ||
557 | - exportedPanel.load = {}; | ||
558 | - exportedPanel.load.url = $(elmt).data("loadURL"); | ||
559 | - } | ||
560 | - if ($(elmt).data("ajaxURL")) { | ||
561 | - exportedPanel.ajax = {}; | ||
562 | - exportedPanel.ajax.url = $(elmt).data("ajaxURL"); | ||
563 | - } | ||
564 | - if ($(elmt).data("iframeDOC") || $(elmt).data("iframeSRC")) { | ||
565 | - exportedPanel.iframe = {}; | ||
566 | - if ($(elmt).data("iframeDOC")) { | ||
567 | - exportedPanel.iframe.srcdoc = $(elmt).data("iframeDOC"); | ||
568 | - } | ||
569 | - if ($(elmt).data("iframeSRC")) { | ||
570 | - exportedPanel.iframe.src = $(elmt).data("iframeSRC"); | ||
571 | - } | ||
572 | - } | ||
573 | - panelArr.push(exportedPanel); | ||
574 | - // restore status that is saved | ||
575 | - switch (exportedPanel.panelstatus) { | ||
576 | - case "minimized": | ||
577 | - $(".jsPanel-btn-min", elmt).trigger("click"); | ||
578 | - break; | ||
579 | - case "maximized": | ||
580 | - $(".jsPanel-btn-max", elmt).trigger("click"); | ||
581 | - break; | ||
582 | - case "smallified": | ||
583 | - $(".jsPanel-btn-small", elmt).trigger("click"); | ||
584 | - break; | ||
585 | - case "smallifiedMax": | ||
586 | - $(".jsPanel-btn-small", elmt).trigger("click"); | ||
587 | - break; | ||
588 | - } | ||
589 | - }); | ||
590 | - //window.localStorage.setItem("jspanels", panelArr); | ||
591 | - window.localStorage.setItem("jspanels", JSON.stringify(panelArr)); | ||
592 | - return panelArr; | ||
593 | - }, | ||
594 | - | ||
595 | - // imports panel layout from localStorage.jspanels and restores panels | ||
596 | - importPanels: function (predefinedConfigs) { | ||
597 | - /* panelConfig needs to be an object with predefined configs. | ||
598 | - * A config named "default" will be applied to ALL panels | ||
599 | - * | ||
600 | - * panelConfig = { default: { } [, config1 [, config2 [, configN ]]] }; | ||
601 | - */ | ||
602 | - var savedPanels, restoredConfig, defaultConfig; | ||
603 | - savedPanels = JSON.parse(localStorage.jspanels) || {}; | ||
604 | - defaultConfig = predefinedConfigs["default"] || {}; | ||
605 | - savedPanels.forEach(function (savedconfig) { | ||
606 | - // safedconfig represents one item in safedPanels | ||
607 | - if (typeof savedconfig.custom.config === "string") { | ||
608 | - restoredConfig = $.extend(true, {}, defaultConfig, predefinedConfigs[savedconfig.custom.config], savedconfig); | ||
609 | - } else { | ||
610 | - restoredConfig = $.extend(true, {}, defaultConfig, savedconfig); | ||
611 | - } | ||
612 | - // restore panel | ||
613 | - $.jsPanel(restoredConfig); | ||
614 | - }); | ||
615 | - }, | ||
616 | - | ||
617 | - // maintains panel position relative to window on scroll of page | ||
618 | - fixPosition: function (panel) { | ||
619 | - var jspaneldiff = panel.offset().top - $(window).scrollTop(); | ||
620 | - panel.jsPanelfixPos = function () { | ||
621 | - panel.css('top', $(window).scrollTop() + jspaneldiff); | ||
622 | - }; | ||
623 | - $(window).on('scroll', panel.jsPanelfixPos); | ||
624 | - }, | ||
625 | - | ||
626 | - // calculate panel margins | ||
627 | - getMargins: function (panel) { | ||
628 | - var off, elmtOff, mR, mL, mB, mT, | ||
629 | - selector = panel.option.paneltype.shiftwithin, | ||
630 | - winWidth = $(window).outerWidth(), | ||
631 | - winHeight = $(window).outerHeight(), | ||
632 | - panelWidth = panel.outerWidth(), | ||
633 | - panelHeight = panel.outerHeight(); | ||
634 | - if (!selector || selector === "body") { | ||
635 | - // panel margins relative to browser viewport | ||
636 | - off = panel.offset(); | ||
637 | - mR = winWidth - off.left - panelWidth + $(window).scrollLeft(); | ||
638 | - mL = winWidth - panelWidth - mR; | ||
639 | - mB = winHeight - off.top - panelHeight + $(window).scrollTop(); | ||
640 | - mT = winHeight - panelHeight - mB; | ||
641 | - } else { | ||
642 | - // panel margins relative to element matching selector "selector" | ||
643 | - elmtOff = $(selector).offset(); | ||
644 | - off = panel.offset(); | ||
645 | - mR = $(selector).outerWidth() - parseInt(panel.css('width')) - (off.left - elmtOff.left); | ||
646 | - mL = off.left - elmtOff.left; | ||
647 | - mB = $(selector).outerHeight() - (off.top - elmtOff.top) - parseInt(panel.css('height')); | ||
648 | - mT = off.top - elmtOff.top; | ||
649 | - } | ||
650 | - return { marginTop: parseInt(mT), marginRight: parseInt(mR), marginBottom: parseInt(mB), marginLeft: parseInt(mL) }; | ||
651 | - }, | ||
652 | - | ||
653 | - // return max value of an array with numbers | ||
654 | - getMaxOfArray: function (numArray) { | ||
655 | - return Math.max.apply(null, numArray); | ||
656 | - }, | ||
657 | - | ||
658 | - // calculate max horizontal and vertical tooltip shift | ||
659 | - getMaxpanelshift: function (panel) { | ||
660 | - var panelWidth = panel.outerWidth(), | ||
661 | - panelHeight = panel.outerHeight(), | ||
662 | - horiz = parseInt(panelWidth / 2) + parseInt(panel.parent().outerWidth() / 2) - 20, | ||
663 | - vert = parseInt(panelHeight / 2) + parseInt(panel.parent().outerHeight() / 2) - 20, | ||
664 | - cornerHoriz = parseInt(panelWidth / 2) - 16, | ||
665 | - cornerVert = parseInt(panelHeight / 2) - 16; | ||
666 | - return { maxshiftH: horiz, maxshiftV: vert, maxCornerH: cornerHoriz, maxCornerV: cornerVert }; | ||
667 | - }, | ||
668 | - | ||
669 | - // hide controls specified by param "sel" of the jsPanel "panel" | ||
670 | - hideControls: function (sel, panel) { | ||
671 | - var controls = panel.header.controls; | ||
672 | - $("*", controls).css('display', 'block'); | ||
673 | - $('#minSpan').css({ 'display': '' }); | ||
674 | - | ||
675 | - $(sel, controls).css('display', 'none'); | ||
676 | - }, | ||
677 | - | ||
678 | - // calculates option.position for hints using 'top left', 'top center' or 'top right' | ||
679 | - hintTop: function (hintGroup) { | ||
680 | - var hintH = 0; | ||
681 | - $("." + hintGroup).each(function () { | ||
682 | - hintH += $(this).outerHeight(true); | ||
683 | - }); | ||
684 | - if (hintGroup === "jsPanel-hint-tr") { | ||
685 | - return { top: hintH, right: 0 }; | ||
686 | - } else if (hintGroup === "jsPanel-hint-tl") { | ||
687 | - return { top: hintH, left: 0 }; | ||
688 | - } else if (hintGroup === "jsPanel-hint-tc") { | ||
689 | - return { top: hintH, left: 'center' }; | ||
690 | - } | ||
691 | - return { top: 0, left: 0 }; | ||
692 | - }, | ||
693 | - | ||
694 | - // loads content in an iFrame | ||
695 | - iframe: function (panel) { | ||
696 | - var iFrame = $("<iframe></iframe>"); | ||
697 | - // iframe content | ||
698 | - if (panel.option.iframe.srcdoc) { | ||
699 | - iFrame.prop("srcdoc", panel.option.iframe.srcdoc); | ||
700 | - panel.data("iframeDOC", panel.option.iframe.srcdoc); // needed for exportPanels() | ||
701 | - } | ||
702 | - if (panel.option.iframe.src) { | ||
703 | - iFrame.prop("src", panel.option.iframe.src); | ||
704 | - panel.data("iframeSRC", panel.option.iframe.src); // needed for exportPanels() | ||
705 | - } | ||
706 | - //iframe size | ||
707 | - if (panel.option.size.width !== "auto" && !panel.option.iframe.width) { | ||
708 | - iFrame.prop("width", "100%"); | ||
709 | - } else if (typeof panel.option.iframe.width === 'string' && panel.option.iframe.width.slice(-1) === '%') { | ||
710 | - iFrame.prop("width", panel.option.iframe.width); | ||
711 | - } else { | ||
712 | - iFrame.prop("width", parseInt(panel.option.iframe.width) + 'px'); | ||
713 | - } | ||
714 | - if (panel.option.size.height !== "auto" && !panel.option.iframe.height) { | ||
715 | - iFrame.prop("height", "100%"); | ||
716 | - } else if (typeof panel.option.iframe.height === 'string' && panel.option.iframe.height.slice(-1) === '%') { | ||
717 | - iFrame.prop("height", panel.option.iframe.height); | ||
718 | - } else { | ||
719 | - iFrame.prop("height", parseInt(panel.option.iframe.height) + 'px'); | ||
720 | - } | ||
721 | - //iframe name | ||
722 | - if (typeof panel.option.iframe.name === 'string') { | ||
723 | - iFrame.prop("name", panel.option.iframe.name); | ||
724 | - } | ||
725 | - //iframe id | ||
726 | - if (typeof panel.option.iframe.id === 'string') { | ||
727 | - iFrame.prop("id", panel.option.iframe.id); | ||
728 | - } | ||
729 | - //iframe seamless (not yet supported by any browser) | ||
730 | - if (panel.option.iframe.seamless) { | ||
731 | - iFrame.prop("seamless", "seamless"); | ||
732 | - } | ||
733 | - //iframe sandbox | ||
734 | - if (typeof panel.option.iframe.sandbox === 'string') { | ||
735 | - iFrame.prop("sandox", panel.option.iframe.sandbox); | ||
736 | - } | ||
737 | - //iframe style | ||
738 | - if ($.isPlainObject(panel.option.iframe.style)) { | ||
739 | - iFrame.css(panel.option.iframe.style); | ||
740 | - } | ||
741 | - //iframe css classes | ||
742 | - if (typeof panel.option.iframe.classname === 'string') { | ||
743 | - iFrame.addClass(panel.option.iframe.classname); | ||
744 | - } else if ($.isFunction(panel.option.iframe.classname)) { | ||
745 | - iFrame.addClass(panel.option.iframe.classname()); | ||
746 | - } | ||
747 | - panel.content.empty().append(iFrame); | ||
748 | - }, | ||
749 | - | ||
750 | - // append modal backdrop | ||
751 | - insertModalBackdrop: function () { | ||
752 | - var backdrop = '<div class="jsPanel-backdrop" style="height:' + $(document).outerHeight() + 'px;"></div>'; | ||
753 | - $('body').append(backdrop); | ||
754 | - /*$(document).on("keydown", ".jsPanel-backdrop", function(e){ | ||
755 | - e.preventDefault(); | ||
756 | - return false; | ||
757 | - });*/ | ||
758 | - }, | ||
759 | - | ||
760 | - // check whether a bootstrap compatible theme is used | ||
761 | - isBootstrapTheme: function (optionBootstrap) { | ||
762 | - if ($.inArray(optionBootstrap, ["default", "primary", "info", "success", "warning", "danger"]) > -1) { | ||
763 | - return optionBootstrap; | ||
764 | - } | ||
765 | - return "default"; | ||
766 | - }, | ||
767 | - | ||
768 | - // loads content using jQuery.load() | ||
769 | - load: function (panel) { | ||
770 | - // alert('pppp') | ||
771 | - panel.content.load(panel.option.load.url, panel.option.load.data || undefined, function (responseText, textStatus, jqXHR) { | ||
772 | - if ($.isFunction(panel.option.load.complete)) { | ||
773 | - panel.option.load.complete.call(panel.content, responseText, textStatus, jqXHR, panel); | ||
774 | - } | ||
775 | - // title h3 might be to small: load() is async! | ||
776 | - jsPanel.resizeTitle(panel); | ||
777 | - // update option.size (content might come delayed) | ||
778 | - jsPanel.updateOptionSize(panel, panel.option.size); | ||
779 | - // fix for a bug in jQuery-UI draggable? that causes the jsPanel to reduce width when dragged beyond boundary of containing element and option.size.width is 'auto' | ||
780 | - panel.content.css('width', function () { | ||
781 | - return panel.content.outerWidth(); | ||
782 | - }); | ||
783 | - }); | ||
784 | - panel.data("loadURL", panel.option.load.url); // needed for exportPanels() | ||
785 | - | ||
786 | - | ||
787 | - | ||
788 | - }, | ||
789 | - | ||
790 | - // maximizes a panel within the body element | ||
791 | - maxWithinBody: function (panel) { | ||
792 | - var newPos, newTop, newLeft, newRight; | ||
793 | - if ((panel.status !== "maximized" || panel.option.panelstatus !== "maximized") && panel.option.paneltype.mode !== 'default') { | ||
794 | - // remove window.scroll handler, is added again later in this function | ||
795 | - $(window).off('scroll', panel.jsPanelfixPos); | ||
796 | - // restore minimized panel to initial container if necessary | ||
797 | - if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
798 | - this.restoreFromMinimized(panel); | ||
799 | - } | ||
800 | - // test to enable fullscreen maximize for panels in a parent other than body | ||
801 | - if (panel.option.controls.maxtoScreen === true) { | ||
802 | - newPos = this.calcPosmaxtoScreen(panel); | ||
803 | - newTop = newPos.top + parseInt(panel.option.maximizedMargin.top); | ||
804 | - newLeft = newPos.left + parseInt(panel.option.maximizedMargin.left); | ||
805 | - } else { | ||
806 | - //nikita | ||
807 | - //newTop = $(window).scrollTop() + parseInt(panel.option.maximizedMargin.top); | ||
808 | - //newLeft = $(window).scrollLeft() + parseInt(panel.option.maximizedMargin.left); | ||
809 | - newTop = 70; | ||
810 | - newLeft = 0; | ||
811 | - //nikita | ||
812 | - newRight = 15; | ||
813 | - } | ||
814 | - panel.css({ | ||
815 | - top: newTop, | ||
816 | - left: newLeft, | ||
817 | - //nikita | ||
818 | - right: newRight, | ||
819 | - width: $(window).outerWidth() - 10, height: $(window).outerHeight() - 90 | ||
820 | - | ||
821 | - //width: $(window).outerWidth() - parseInt(panel.option.maximizedMargin.left) - parseInt(panel.option.maximizedMargin.right), | ||
822 | - //height: $(window).outerHeight() - parseInt(panel.option.maximizedMargin.top) - parseInt(panel.option.maximizedMargin.bottom) | ||
823 | - }); | ||
824 | - if ($('.tools') != null) { | ||
825 | - //nikita | ||
826 | - if ($('#canvasDiv') != null) { | ||
827 | - if (panel.outerHeight() >= 435 && panel.outerWidth() >= 650) { | ||
828 | - // alert('if') | ||
829 | - $('#canvasDiv').css('height', panel.outerHeight() - 75) | ||
830 | - $('#canvasDiv').css('width', panel.outerWidth() - 100) | ||
831 | - $('#canvasDiv').css('overflow', 'scroll') | ||
832 | - } | ||
833 | - else { | ||
834 | - // alert('else') | ||
835 | - $('#canvasDiv').css('height', panel.outerHeight() - 110) | ||
836 | - $('#canvasDiv').css('width', panel.outerWidth() - 90) | ||
837 | - $('#canvasDiv').css('overflow', 'scroll') | ||
838 | - } | ||
839 | - } | ||
840 | - } | ||
841 | - //nikita | ||
842 | - if (!panel.option.controls.maxtoScreen || (panel.option.controls.maxtoScreen && panel.option.selector === 'body')) { | ||
843 | - // test to enable fullscreen maximize for panels in a parent other than body | ||
844 | - this.fixPosition(panel); | ||
845 | - } | ||
846 | - } | ||
847 | - }, | ||
848 | - | ||
849 | - // maximizes a panel within an element other than body | ||
850 | - maxWithinElement: function (panel) { | ||
851 | - // debugger; | ||
852 | - if ((panel.status !== "maximized" || panel.option.panelstatus !== "maximized") && panel.option.paneltype.mode !== 'default') { | ||
853 | - // restore minimized panel to initial container if necessary | ||
854 | - if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
855 | - this.restoreFromMinimized(panel); | ||
856 | - } | ||
857 | - panel.css({ | ||
858 | - top: parseInt(70),//panel.option.maximizedMargin.top), | ||
859 | - left: parseInt(panel.option.maximizedMargin.left), | ||
860 | - width: parseInt(panel.parent().outerWidth(), 10) - parseInt(panel.option.maximizedMargin.left) - parseInt(panel.option.maximizedMargin.right), | ||
861 | - height: parseInt(panel.parent().outerHeight()) - parseInt(panel.option.maximizedMargin.top) - parseInt(panel.option.maximizedMargin.bottom) - 65 | ||
862 | - }); | ||
863 | - } | ||
864 | - if ($('.tools').length> 0) { | ||
865 | - //nikita | ||
866 | - if ($('#canvasDiv') != null) { | ||
867 | - if (panel.outerHeight() >= 435 && panel.outerWidth() >= 650) { | ||
868 | - //alert('if') | ||
869 | - // debugger; | ||
870 | - $('#canvasDiv').css('height', panel.outerHeight() - 85) | ||
871 | - $('#canvasDiv').css('width', panel.outerWidth() - 90) | ||
872 | - $('#canvasDiv').css('overflow', 'scroll') | ||
873 | - } | ||
874 | - else { | ||
875 | - // alert('else') | ||
876 | - $('#canvasDiv').css('height', panel.outerHeight() - 105) | ||
877 | - $('#canvasDiv').css('width', panel.outerWidth() - 80) | ||
878 | - $('#canvasDiv').css('overflow', 'scroll') | ||
879 | - | ||
880 | - } | ||
881 | - } | ||
882 | - } | ||
883 | - //nikita | ||
884 | - // debugger; | ||
885 | - // $(".fa-minus").removeClass('display'); | ||
886 | - $('#minSpan').css({ 'display': '' }); | ||
887 | - }, | ||
888 | - | ||
889 | - // calls functions to maximize a jsPanel | ||
890 | - maximize: function (panel) { | ||
891 | - // debugger; | ||
892 | - panel.trigger('jspanelbeforemaximize', panel.attr('id')); | ||
893 | - if ($.isFunction(panel.option.onbeforemaximize)) { | ||
894 | - var maximize = panel.option.onbeforemaximize.call(panel, panel); | ||
895 | - if (maximize === false) { | ||
896 | - return panel; | ||
897 | - } | ||
898 | - } | ||
899 | - if (panel.parentElmtTagname === 'body' || panel.option.controls.maxtoScreen === true) { | ||
900 | - this.maxWithinBody(panel); | ||
901 | - } else { | ||
902 | - this.maxWithinElement(panel); | ||
903 | - } | ||
904 | - panel.trigger('jspanelmaximized', panel.attr('id')); | ||
905 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
906 | - if ($.isFunction(panel.option.onmaximized)) { | ||
907 | - panel.option.onmaximized.call(panel, panel); | ||
908 | - } | ||
909 | - return panel; | ||
910 | - }, | ||
911 | - | ||
912 | - // minimizes a jsPanel to the lower left corner of the browser viewport | ||
913 | - minimize: function (panel) { | ||
914 | - panel.trigger('jspanelbeforeminimize', panel.attr('id')); | ||
915 | - if ($.isFunction(panel.option.onbeforeminimize)) { | ||
916 | - var minimize = panel.option.onbeforeminimize.call(panel, panel); | ||
917 | - if (minimize === false) { | ||
918 | - return panel; | ||
919 | - } | ||
920 | - } | ||
921 | - panel.data({ // needed for method exportPanels() | ||
922 | - "paneltop": parseInt(panel.option.position.top), | ||
923 | - "panelleft": parseInt(panel.option.position.left), | ||
924 | - "panelwidth": parseInt(panel.option.size.width), | ||
925 | - "panelheight": parseInt($(".jsPanel-content", panel).css("height")) | ||
926 | - }); | ||
927 | - // update panel size to have correct values when normalizing again | ||
928 | - if (panel.status === "normalized" || panel.option.panelstatus === "normalized") { | ||
929 | - panel.option.size.width = panel.outerWidth(); | ||
930 | - panel.option.size.height = panel.outerHeight(); | ||
931 | - } | ||
932 | - panel.animate({ | ||
933 | - opacity: 0 | ||
934 | - }, { | ||
935 | - duration: 400, // fade out speed when minimizing | ||
936 | - complete: function () { | ||
937 | - panel.animate({ | ||
938 | - width: jsPanel.widthForMinimized + "px", | ||
939 | - height: '28px' | ||
940 | - }, { | ||
941 | - duration: 100, | ||
942 | - complete: function () { | ||
943 | - jsPanel.movetoMinified(panel); | ||
944 | - jsPanel.resizeTitle(panel); | ||
945 | - panel.css('opacity', 1); | ||
946 | - } | ||
947 | - }); | ||
948 | - } | ||
949 | - }); | ||
950 | - if ($.isFunction(panel.option.onminimized)) { | ||
951 | - panel.option.onminimized.call(panel, panel); | ||
952 | - } | ||
953 | - return panel; | ||
954 | - }, | ||
955 | - | ||
956 | - // moves a panel to the minimized container | ||
957 | - movetoMinified: function (panel) { | ||
958 | - // wenn der Container für die minimierten jsPanels noch nicht existiert -> erstellen | ||
959 | - if ($('#jsPanel-min-container').length === 0) { | ||
960 | - $('body').append('<div id="jsPanel-min-container"></div>'); | ||
961 | - } | ||
962 | - if (panel.status !== "minimized" || panel.option.panelstatus !== "minimized") { | ||
963 | - // jsPanel in vorgesehenen Container verschieben | ||
964 | - panel.css({ | ||
965 | - left: ($('.jsPanel', '#jsPanel-min-container').length * jsPanel.widthForMinimized), | ||
966 | - top: 0, | ||
967 | - opacity: 1 | ||
968 | - }) | ||
969 | - .appendTo('#jsPanel-min-container') | ||
970 | - .resizable({ disabled: true }) | ||
971 | - .draggable({ disabled: true }); | ||
972 | - panel.trigger('jspanelminimized', panel.attr('id')); | ||
973 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
974 | - } | ||
975 | - }, | ||
976 | - | ||
977 | - // restores a panel to its "normalized" (not minimized, maximized or smallified) position & size | ||
978 | - normalize: function (panel) { | ||
979 | - // debugger; | ||
980 | - var panelTop, | ||
981 | - interactions = ["resizable", "draggable"]; | ||
982 | - panel.trigger('jspanelbeforenormalize', panel.attr('id')); | ||
983 | - if ($.isFunction(panel.option.onbeforenormalize)) { | ||
984 | - var normalize = panel.option.onbeforenormalize.call(panel, panel); | ||
985 | - if (normalize === false) { | ||
986 | - return panel; | ||
987 | - } | ||
988 | - } | ||
989 | - // remove window.scroll handler, is added again later in this function | ||
990 | - $(window).off('scroll', panel.jsPanelfixPos); | ||
991 | - // restore minimized panel to initial container if necessary | ||
992 | - if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
993 | - this.restoreFromMinimized(panel); | ||
994 | - } | ||
995 | - // correction for panels maximized in body after page was scrolled | ||
996 | - if (panel.parentElmtTagname === 'body') { | ||
997 | - panelTop = $(window).scrollTop() + panel.verticalOffset; | ||
998 | - } else { | ||
999 | - panelTop = panel.option.position.top; | ||
1000 | - } | ||
1001 | - panel.css({ | ||
1002 | - width: panel.option.size.width, | ||
1003 | - height: panel.option.size.height + 10, | ||
1004 | - top: panelTop, | ||
1005 | - left: panel.option.position.left | ||
1006 | - }); | ||
1007 | - interactions.forEach(function (action) { | ||
1008 | - if (panel.option[action] !== "disabled") { | ||
1009 | - panel[action]("enable"); | ||
1010 | - // get resizer and cursor for resizable back | ||
1011 | - $('.ui-icon-gripsmall-diagonal-se', panel).css({ 'background-image': 'none', 'text-indent': 0 }); | ||
1012 | - $('.ui-resizable-handle', panel).css({ 'cursor': '' }); | ||
1013 | - } | ||
1014 | - }); | ||
1015 | - panel.trigger('jspanelnormalized', panel.attr('id')); | ||
1016 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1017 | - if (panel.parentElmtTagname === 'body') { | ||
1018 | - this.fixPosition(panel); | ||
1019 | - } | ||
1020 | - if ($.isFunction(panel.option.onnormalized)) { | ||
1021 | - panel.option.onnormalized.call(panel, panel); | ||
1022 | - } | ||
1023 | - return panel; | ||
1024 | - }, | ||
1025 | - | ||
1026 | - // replace bottom/right values with corresponding top/left values if necessary and update option.position | ||
1027 | - replaceCSSBottomRight: function (panel) { | ||
1028 | - var panelPosition = panel.position(); | ||
1029 | - if (panel.css('bottom')) { | ||
1030 | - panel.css({ | ||
1031 | - 'top': parseInt(panelPosition.top, 10), | ||
1032 | - 'bottom': '' | ||
1033 | - }); | ||
1034 | - panel.option.position.top = parseInt(panelPosition.top, 10); | ||
1035 | - } | ||
1036 | - if (panel.css('right')) { | ||
1037 | - panel.css({ | ||
1038 | - 'left': parseInt(panelPosition.left, 10), | ||
1039 | - 'right': '' | ||
1040 | - }); | ||
1041 | - panel.option.position.left = parseInt(panelPosition.left, 10); | ||
1042 | - } | ||
1043 | - }, | ||
1044 | - | ||
1045 | - // reposition hint upon closing | ||
1046 | - reposHints: function (hintGroup, jsPtagname) { | ||
1047 | - var hintH; | ||
1048 | - if (jsPtagname === 'body') { | ||
1049 | - hintH = $(window).scrollTop(); | ||
1050 | - } else { | ||
1051 | - hintH = 0; | ||
1052 | - } | ||
1053 | - $("." + hintGroup).each(function () { | ||
1054 | - $(this).animate({ | ||
1055 | - top: hintH | ||
1056 | - }); | ||
1057 | - hintH += $(this).outerHeight(true); | ||
1058 | - }); | ||
1059 | - }, | ||
1060 | - | ||
1061 | - // reposition hints on window scroll | ||
1062 | - reposHintsScroll: function (panel) { | ||
1063 | - var dif = panel.offset().top - $(window).scrollTop(); | ||
1064 | - // with window.onscroll only the last added hint would stay in position | ||
1065 | - $(window).scroll(function () { | ||
1066 | - panel.css('top', $(window).scrollTop() + dif); | ||
1067 | - }); | ||
1068 | - }, | ||
1069 | - | ||
1070 | - // repositions a panel and optionally moves it to another container | ||
1071 | - reposition: function (panel, position, selector) { | ||
1072 | - //alert('reposition') | ||
1073 | - if (selector && typeof selector === "string") { | ||
1074 | - panel.option.selector = selector; | ||
1075 | - panel.appendTo(selector); | ||
1076 | - panel.parentElmt = $(selector).first(); | ||
1077 | - panel.parentElmtTagname = panel.parentElmt[0].tagName.toLowerCase(); | ||
1078 | - } | ||
1079 | - if (panel.option.paneltype.type !== 'tooltip' && panel.option.paneltype.type !== 'hint') { | ||
1080 | - // rewrite passed position to be a proper object | ||
1081 | - panel.option.position = jsPanel.rewriteOPosition(position); | ||
1082 | - // delete element styles concerning position, otherwise you might end up with left &right and/or top & bottom values | ||
1083 | - panel.css({ top: "", right: "", bottom: "", left: "" }); | ||
1084 | - this.calcPanelposition(panel); | ||
1085 | - panel.verticalOffset = jsPanel.calcVerticalOffset(panel) || 0; | ||
1086 | - this.replaceCSSBottomRight(panel); | ||
1087 | - if (panel.parentElmtTagname === "body") { | ||
1088 | - this.fixPosition(panel); | ||
1089 | - } else { | ||
1090 | - $(window).off('scroll', panel.jsPanelfixPos); | ||
1091 | - } | ||
1092 | - this.updateOptionPosition(panel); | ||
1093 | - } | ||
1094 | - return panel; | ||
1095 | - }, | ||
1096 | - | ||
1097 | - // repositions minimized jsPanels | ||
1098 | - reposMinimized: function () { | ||
1099 | - $('.jsPanel', '#jsPanel-min-container').each(function (index, elmt) { | ||
1100 | - $(elmt).animate({ | ||
1101 | - left: (index * jsPanel.widthForMinimized) | ||
1102 | - }); | ||
1103 | - }); | ||
1104 | - }, | ||
1105 | - | ||
1106 | - // resize exsisting jsPanel; resizes the full panel (not content section only) | ||
1107 | - resize: function (panel, width, height) { | ||
1108 | - // debugger; | ||
1109 | - if (panel.option.panelstatus !== "minimized") { // v2.4.1 don't call resize() on minimized panels | ||
1110 | - if (width && width !== null) { | ||
1111 | - panel.css("width", width); | ||
1112 | - } else { | ||
1113 | - panel.css("width", panel.content.css("width")); | ||
1114 | - } | ||
1115 | - if (height && height !== null) { | ||
1116 | - panel.css("height", height); | ||
1117 | - } | ||
1118 | - this.resizeContent(panel); | ||
1119 | - this.resizeTitle(panel); | ||
1120 | - } | ||
1121 | - | ||
1122 | - if ($('#canvasDiv') != null) { | ||
1123 | - $('#canvasDiv').css('height', $(window).outerHeight() - 120) | ||
1124 | - $('#leftToolBar').css('height', $(window).outerHeight() - 120) | ||
1125 | - | ||
1126 | - } | ||
1127 | - }, | ||
1128 | - | ||
1129 | - // reset dimensions of content section after resize and so on | ||
1130 | - resizeContent: function (panel) { | ||
1131 | - var hdrftr; | ||
1132 | - if (panel.footer.css('display') === 'none') { | ||
1133 | - hdrftr = panel.header.outerHeight(); | ||
1134 | - } else { | ||
1135 | - hdrftr = panel.header.outerHeight() + panel.footer.outerHeight(); | ||
1136 | - } | ||
1137 | - panel.content.css({ | ||
1138 | - height: (panel.outerHeight() - hdrftr), | ||
1139 | - //nikita | ||
1140 | - width: panel.outerWidth() | ||
1141 | - }); | ||
1142 | - return panel; | ||
1143 | - }, | ||
1144 | - | ||
1145 | - // resize the title h3 to use full width minus controls width (and prevent being longer than panel) | ||
1146 | - resizeTitle: function (panel) { | ||
1147 | - var titleWidth = (panel.outerWidth() - $(panel.header.controls).outerWidth() - 15); | ||
1148 | - panel.header.title.css('width', titleWidth); | ||
1149 | - }, | ||
1150 | - | ||
1151 | - // restores minimized panels to their initial container, reenables resizable and draggable, repositions minimized panels | ||
1152 | - restoreFromMinimized: function (panel) { | ||
1153 | - var interactions = ["resizable", "draggable"]; | ||
1154 | - // restore minimized panel to initial container | ||
1155 | - if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
1156 | - panel.appendTo(panel.option.selector); | ||
1157 | - } | ||
1158 | - interactions.forEach(function (action) { | ||
1159 | - if (panel.option[action] !== "disabled") { | ||
1160 | - panel[action]("enable"); | ||
1161 | - // get resizer and cursor for resizable back | ||
1162 | - $('.ui-icon-gripsmall-diagonal-se', panel).css({ 'background-image': 'none', 'text-indent': 0 }); | ||
1163 | - $('.ui-resizable-handle', panel).css({ 'cursor': '' }); | ||
1164 | - } | ||
1165 | - }); | ||
1166 | - // reposition minimized panels | ||
1167 | - this.reposMinimized(jsPanel.widthForMinimized); | ||
1168 | - }, | ||
1169 | - | ||
1170 | - // rewrite option.paneltype strings to objects and set defaults for option.paneltype | ||
1171 | - rewriteOPaneltype: function (optionPaneltype) { | ||
1172 | - var op = optionPaneltype; | ||
1173 | - if (op === 'modal') { | ||
1174 | - return { type: 'modal', mode: 'default' }; | ||
1175 | - } else if (op === 'tooltip') { | ||
1176 | - return { type: 'tooltip', position: 'top' }; | ||
1177 | - } else if (op === 'hint') { | ||
1178 | - return { type: 'hint' }; | ||
1179 | - } else if (op.type === 'modal') { | ||
1180 | - return { type: 'modal', mode: op.mode || 'default' }; | ||
1181 | - } else if (op.type === 'tooltip') { | ||
1182 | - return { | ||
1183 | - type: 'tooltip', | ||
1184 | - mode: op.mode || false, | ||
1185 | - position: op.position || false, | ||
1186 | - shiftwithin: op.shiftwithin || "body", | ||
1187 | - solo: op.solo || false, | ||
1188 | - cornerBG: op.cornerBG || false, | ||
1189 | - cornerOX: op.cornerOX || false, | ||
1190 | - cornerOY: op.cornerOY || false | ||
1191 | - }; | ||
1192 | - } else { | ||
1193 | - return { paneltype: false }; | ||
1194 | - } | ||
1195 | - }, | ||
1196 | - | ||
1197 | - // converts option.position string to object | ||
1198 | - rewriteOPosition: function (optionPosition) { | ||
1199 | - var op = optionPosition; | ||
1200 | - if (op === 'center') { | ||
1201 | - return { top: 'center', left: 'center' }; | ||
1202 | - } else if (op === 'auto') { | ||
1203 | - return { top: 'auto', left: 'auto' }; | ||
1204 | - } else if (op === 'top left') { | ||
1205 | - return { top: '0', left: '0' }; | ||
1206 | - } else if (op === 'top center') { | ||
1207 | - return { top: '0', left: 'center' }; | ||
1208 | - } else if (op === 'top right') { | ||
1209 | - return { top: '0', right: '0' }; | ||
1210 | - } else if (op === 'center right') { | ||
1211 | - return { top: 'center', right: '0' }; | ||
1212 | - } else if (op === 'bottom right') { | ||
1213 | - return { bottom: '0', right: '0' }; | ||
1214 | - } else if (op === 'bottom center') { | ||
1215 | - return { bottom: '0', left: 'center' }; | ||
1216 | - } else if (op === 'bottom left') { | ||
1217 | - return { bottom: '0', left: '0' }; | ||
1218 | - } else if (op === 'center left') { | ||
1219 | - return { top: 'center', left: '0' }; | ||
1220 | - } | ||
1221 | - // if bottom and/or right is set to "center" change that to top and/or left set to "center" | ||
1222 | - if (op.bottom === "center") { | ||
1223 | - delete op.bottom; | ||
1224 | - op.top = "center"; | ||
1225 | - } | ||
1226 | - if (op.right === "center") { | ||
1227 | - delete op.right; | ||
1228 | - op.left = "center"; | ||
1229 | - } | ||
1230 | - return optionPosition; | ||
1231 | - }, | ||
1232 | - | ||
1233 | - // converts option.size string to object | ||
1234 | - rewriteOSize: function (optionSize) { | ||
1235 | - var oSize = optionSize; | ||
1236 | - if (typeof oSize === 'string' && oSize === 'auto') { | ||
1237 | - oSize = { | ||
1238 | - width: 'auto', | ||
1239 | - height: 'auto' | ||
1240 | - }; | ||
1241 | - } | ||
1242 | - return oSize; | ||
1243 | - }, | ||
1244 | - | ||
1245 | - // set default options for hints and add necessary classes | ||
1246 | - setHintDefaults: function (panel) { | ||
1247 | - panel.option.resizable = false; | ||
1248 | - panel.option.draggable = false; | ||
1249 | - panel.option.removeHeader = true; | ||
1250 | - panel.option.toolbarFooter = false; | ||
1251 | - panel.option.show = 'fadeIn'; | ||
1252 | - panel.addClass('jsPanel-hint'); | ||
1253 | - panel.content.addClass('jsPanel-hint-content'); | ||
1254 | - // autoclose default 8 sec | or -1 to deactivate | ||
1255 | - if (!panel.option.autoclose) { | ||
1256 | - panel.option.autoclose = 8000; | ||
1257 | - } else if (panel.option.autoclose < 0) { | ||
1258 | - panel.option.autoclose = false; | ||
1259 | - } | ||
1260 | - // add class according option.theme to color the hint background | ||
1261 | - panel.content.addClass('jsPanel-hint-' + panel.option.theme); | ||
1262 | - panel.content.append('<div class="jsPanel-hint-close jsglyph jsglyph-remove"></div>'); | ||
1263 | - }, | ||
1264 | - | ||
1265 | - // set default options for standard modal | ||
1266 | - setModalDefaults: function (panel) { | ||
1267 | - panel.option.selector = 'body'; | ||
1268 | - panel.option.show = 'fadeIn'; | ||
1269 | - panel.addClass('jsPanel-modal'); | ||
1270 | - if (panel.option.paneltype.mode === 'default') { | ||
1271 | - panel.option.resizable = false; | ||
1272 | - panel.option.draggable = false; | ||
1273 | - panel.option.removeHeader = false; | ||
1274 | - panel.option.position = { top: 'center', left: 'center' }; | ||
1275 | - panel.option.offset = { top: 0, left: 0 }; | ||
1276 | - panel.option.controls.buttons = 'closeonly'; //do not delete else "modal" with no close button possible | ||
1277 | - $(".jsPanel-btn-min, .jsPanel-btn-norm, .jsPanel-btn-max, .jsPanel-btn-small, .jsPanel-btn-smallrev", panel).remove(); | ||
1278 | - $(panel.header, panel.header.title, panel.footer).css('cursor', 'default'); | ||
1279 | - $('.jsPanel-title', panel).css('cursor', 'inherit'); | ||
1280 | - } | ||
1281 | - }, | ||
1282 | - | ||
1283 | - // set right-to-left text direction and language; set styles and reoorder controls for rtl | ||
1284 | - setRTL: function (panel) { | ||
1285 | - var elmts = [panel.header.title, panel.content, panel.header.toolbar, panel.footer]; | ||
1286 | - elmts.forEach(function (item) { | ||
1287 | - item.prop('dir', 'rtl'); | ||
1288 | - if (panel.option.rtl.lang) { | ||
1289 | - item.prop('lang', panel.option.rtl.lang); | ||
1290 | - } | ||
1291 | - }); | ||
1292 | - panel.header.title.css('text-align', 'right'); | ||
1293 | - $('.jsPanel-btn-close', panel.header.controls).insertAfter($('.jsPanel-btn-min', panel.header.controls)); | ||
1294 | - $('.jsPanel-btn-max', panel.header.controls).insertAfter($('.jsPanel-btn-min', panel.header.controls)); | ||
1295 | - $('.jsPanel-btn-small', panel.header.controls).insertBefore($('.jsPanel-btn-min', panel.header.controls)); | ||
1296 | - $('.jsPanel-btn-smallrev', panel.header.controls).insertBefore($('.jsPanel-btn-min', panel.header.controls)); | ||
1297 | - $('.jsPanel-hdr-r', panel).css({ left: '0px', right: '', position: 'relative', 'float': 'left' }); | ||
1298 | - $('.jsPanel-hint-close', panel).css('float', 'left'); | ||
1299 | - $('.jsPanel-title', panel).css('float', 'right'); | ||
1300 | - $('.jsPanel-ftr', panel).append('<div style="clear:both;height:0;"></div>'); | ||
1301 | - $('button', panel.footer).css('float', 'left'); | ||
1302 | - }, | ||
1303 | - | ||
1304 | - // set default options for tooltips | ||
1305 | - setTooltipDefaults: function (panel) { | ||
1306 | - panel.option.position = {}; | ||
1307 | - panel.option.resizable = false; | ||
1308 | - panel.option.draggable = false; | ||
1309 | - panel.option.show = 'fadeIn'; | ||
1310 | - panel.option.controls.buttons = 'closeonly'; | ||
1311 | - panel.header.title.css('cursor', 'inherit'); | ||
1312 | - panel.footer.css('cursor', 'inherit'); | ||
1313 | - panel.addClass('jsPanel-tt'); | ||
1314 | - }, | ||
1315 | - | ||
1316 | - // returns a z-index value for a panel in order to have it on top | ||
1317 | - setZi: function (panel) { | ||
1318 | - var jspanel, allZi = [], maxZi; | ||
1319 | - if (typeof panel === "string") { | ||
1320 | - jspanel = $(panel); | ||
1321 | - } else { | ||
1322 | - jspanel = panel; | ||
1323 | - } | ||
1324 | - // build array with all z-index values | ||
1325 | - $(".jsPanel:not('.jsPanel-modal, .jsPanel-nofront')").each(function (i, elmt) { | ||
1326 | - if (jspanel.attr("id") !== $(elmt).attr("id")) { | ||
1327 | - allZi.push($(elmt).css("z-index")); | ||
1328 | - } | ||
1329 | - }); | ||
1330 | - //allZi.sort(function(a, b) {return a - b}); // sort array ascending | ||
1331 | - //console.log(allZi); | ||
1332 | - maxZi = this.getMaxOfArray(allZi); | ||
1333 | - return maxZi + 1; | ||
1334 | - }, | ||
1335 | - | ||
1336 | - // shift tooltip left/right if it overflows window; when using horizontal offsets of panel and/or corner result might be not as expected | ||
1337 | - shiftTooltipHorizontal: function (panel) { | ||
1338 | - var margins = this.getMargins(panel), | ||
1339 | - leftShiftRequired, | ||
1340 | - maxShift = this.getMaxpanelshift(panel), | ||
1341 | - maxLeftShift = maxShift.maxshiftH, | ||
1342 | - shift, | ||
1343 | - maxCornerLeft = maxShift.maxCornerH, | ||
1344 | - cornerShift, | ||
1345 | - newPanelLeft = 0, | ||
1346 | - newCornerLeft = 0; | ||
1347 | - if (margins.marginLeft < 0 && margins.marginRight > 0) { | ||
1348 | - // if panel overflows left window border | ||
1349 | - leftShiftRequired = Math.abs(margins.marginLeft) + 5 || 0; | ||
1350 | - shift = Math.min(leftShiftRequired, maxLeftShift) || 0; | ||
1351 | - cornerShift = Math.min(maxCornerLeft, shift) || 0; | ||
1352 | - newPanelLeft = parseInt(panel.css('left')) + shift + "px"; | ||
1353 | - newCornerLeft = parseInt($('.jsPanel-corner', panel).css('left')) - cornerShift + "px"; | ||
1354 | - } else if (margins.marginRight < 0 && margins.marginLeft > 0) { | ||
1355 | - // if panel overflows right window border | ||
1356 | - leftShiftRequired = Math.abs(margins.marginRight) + 5 || 0; | ||
1357 | - shift = Math.min(leftShiftRequired, maxLeftShift) || 0; | ||
1358 | - cornerShift = Math.min(maxCornerLeft, shift) || 0; | ||
1359 | - newPanelLeft = parseInt(panel.css('left')) - shift + "px"; | ||
1360 | - newCornerLeft = parseInt($('.jsPanel-corner', panel).css('left')) + cornerShift + "px"; | ||
1361 | - } | ||
1362 | - if ((margins.marginLeft < 0 && margins.marginRight > 0) || (margins.marginRight < 0 && margins.marginLeft > 0)) { | ||
1363 | - // shift panel | ||
1364 | - panel.animate({ | ||
1365 | - "left": newPanelLeft | ||
1366 | - }, { queue: false /* to have both animation run simultaneously */ }); | ||
1367 | - | ||
1368 | - // shift corner if present | ||
1369 | - if ($('.jsPanel-corner', panel)) { | ||
1370 | - $('.jsPanel-corner', panel).animate({ | ||
1371 | - "left": newCornerLeft | ||
1372 | - }, { queue: false /* to have both animation run simultaneously */ }); | ||
1373 | - } | ||
1374 | - } | ||
1375 | - }, | ||
1376 | - | ||
1377 | - // shift tooltip up/down if it overflows window; when using vertical offsets of panel and/or corner result might be not as expected | ||
1378 | - shiftTooltipVertical: function (panel) { | ||
1379 | - //console.log( parseInt($('*:first-child', panel.parent()).css('margin-left')) ); | ||
1380 | - var margins = this.getMargins(panel), | ||
1381 | - topShiftRequired, | ||
1382 | - maxShift = this.getMaxpanelshift(panel), | ||
1383 | - maxTopShift = maxShift.maxshiftV, | ||
1384 | - shift, | ||
1385 | - maxCornerTop = maxShift.maxCornerV, | ||
1386 | - cornerShift, | ||
1387 | - newPanelTop = 0, | ||
1388 | - newCornerTop = 0; | ||
1389 | - if (margins.marginTop < 0 && margins.marginBottom > 0) { | ||
1390 | - // if panel overflows top window border | ||
1391 | - topShiftRequired = Math.abs(margins.marginTop) + 5 || 0; | ||
1392 | - shift = Math.min(topShiftRequired, maxTopShift) || 0; | ||
1393 | - cornerShift = Math.min(maxCornerTop, shift) || 0; | ||
1394 | - newPanelTop = parseInt(panel.css('top')) + shift + "px"; | ||
1395 | - newCornerTop = parseInt($('.jsPanel-corner', panel).css('top')) - cornerShift + "px"; | ||
1396 | - } else if (margins.marginBottom < 0 && margins.marginTop > 0) { | ||
1397 | - // if panel overflows bottom window border | ||
1398 | - topShiftRequired = Math.abs(margins.marginBottom) + 5 || 0; | ||
1399 | - shift = Math.min(topShiftRequired, maxTopShift) || 0; | ||
1400 | - cornerShift = Math.min(maxCornerTop, shift) || 0; | ||
1401 | - newPanelTop = parseInt(panel.css('top')) - shift + "px"; | ||
1402 | - newCornerTop = parseInt($('.jsPanel-corner', panel).css('top')) + cornerShift + "px"; | ||
1403 | - } | ||
1404 | - if ((margins.marginTop < 0 && margins.marginBottom > 0) || (margins.marginBottom < 0 && margins.marginTop > 0)) { | ||
1405 | - // shift panel | ||
1406 | - panel.animate({ | ||
1407 | - "top": newPanelTop | ||
1408 | - }, { queue: false /* to have both animation run simultaneously */ }); | ||
1409 | - | ||
1410 | - // shift corner if present | ||
1411 | - if ($('.jsPanel-corner', panel)) { | ||
1412 | - $('.jsPanel-corner', panel).animate({ | ||
1413 | - "top": newCornerTop | ||
1414 | - }, { queue: false /* to have both animation run simultaneously */ }); | ||
1415 | - } | ||
1416 | - } | ||
1417 | - }, | ||
1418 | - | ||
1419 | - smallify: function (panel) { | ||
1420 | - var statusNew; | ||
1421 | - if ((panel.status !== "smallified" || panel.option.panelstatus !== "smallified") && (panel.status !== "smallifiedMax" || panel.option.panelstatus !== "smallifiedMax")) { | ||
1422 | - if (panel.status === "maximized" || panel.option.panelstatus === "maximized") { | ||
1423 | - statusNew = "smallifiedMax"; | ||
1424 | - } else { | ||
1425 | - statusNew = "smallified"; | ||
1426 | - } | ||
1427 | - // store panel height in function property | ||
1428 | - panel.smallify.height = panel.outerHeight(); | ||
1429 | - panel.panelheaderheight = panel.header.outerHeight() - 2; | ||
1430 | - panel.panelfooterheight = panel.footer.outerHeight(); | ||
1431 | - panel.panelcontentheight = panel.content.outerHeight(); | ||
1432 | - panel.animate({ | ||
1433 | - height: panel.panelheaderheight | ||
1434 | - }, | ||
1435 | - { | ||
1436 | - done: function () { | ||
1437 | - if (panel.status === 'maximized' || panel.option.panelstatus === 'maximized') { | ||
1438 | - jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-small", panel); | ||
1439 | - } else { | ||
1440 | - jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-small", panel); | ||
1441 | - } | ||
1442 | - jsPanel.updateStateProps(panel, statusNew); | ||
1443 | - panel.trigger('jspanel' + statusNew, panel.attr('id')); | ||
1444 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1445 | - } | ||
1446 | - }); | ||
1447 | - } | ||
1448 | - }, | ||
1449 | - | ||
1450 | - unsmallify: function (panel) { | ||
1451 | - panel.animate({ | ||
1452 | - height: panel.smallify.height | ||
1453 | - }, | ||
1454 | - { | ||
1455 | - done: function () { | ||
1456 | - if (panel.status === 'smallified' || panel.option.panelstatus === 'smallified') { | ||
1457 | - jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", panel); | ||
1458 | - jsPanel.updateStateProps(panel, "normalized"); | ||
1459 | - panel.trigger('jspanelnormalized', panel.attr('id')); | ||
1460 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1461 | - } else { | ||
1462 | - jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-smallrev", panel); | ||
1463 | - jsPanel.updateStateProps(panel, "maximized"); | ||
1464 | - panel.trigger('jspanelmaximized', panel.attr('id')); | ||
1465 | - panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1466 | - } | ||
1467 | - } | ||
1468 | - } | ||
1469 | - ); | ||
1470 | - }, | ||
1471 | - | ||
1472 | - // updates option.position to hold actual values | ||
1473 | - updateOptionPosition: function (panel) { | ||
1474 | - panel.option.position.top = panel.css('top'); | ||
1475 | - panel.option.position.left = panel.css('left'); | ||
1476 | - }, | ||
1477 | - | ||
1478 | - // updates option.size to hold actual values | ||
1479 | - updateOptionSize: function (panel) { | ||
1480 | - panel.option.size.width = panel.css('width'); | ||
1481 | - panel.option.size.height = $(".jsPanel-content", panel).css("height"); | ||
1482 | - }, | ||
1483 | - | ||
1484 | - updateCustomData: function (panel, key, val) { | ||
1485 | - var custom = panel.data("custom"); | ||
1486 | - custom[key] = val; | ||
1487 | - panel.data("custom", custom); | ||
1488 | - }, | ||
1489 | - | ||
1490 | - updateStateProps: function (panel, status) { | ||
1491 | - panel.status = status; | ||
1492 | - panel.option.panelstatus = status; | ||
1493 | - panel.data("panelstatus", status); | ||
1494 | - panel.alterClass("jsPanel-state-*", "jsPanel-state-" + status); | ||
1495 | - }, | ||
1496 | - | ||
1497 | - getScope: function (ctrlName) { | ||
1498 | - var sel = 'div[ng-controller="' + ctrlName + '"]'; | ||
1499 | - return angular.element(sel).scope(); | ||
1500 | - }, | ||
1501 | - | ||
1502 | - getRootScope: function (controllerName) { | ||
1503 | - var $body = angular.element(document.body); // 1 | ||
1504 | - return $body.scope().$root; | ||
1505 | - | ||
1506 | - } | ||
1507 | -}; | ||
1508 | - | ||
1509 | -console.log("jsPanel version: " + jsPanel.version); | ||
1510 | - | ||
1511 | -(function ($) { | ||
1512 | - $.jsPanel = function (config) { | ||
1513 | - | ||
1514 | - | ||
1515 | - var jsP, template, id, | ||
1516 | - panelconfig = config || {}, | ||
1517 | - optConfig = panelconfig.config || {}; | ||
1518 | - | ||
1519 | - // use custom jsPanel template if present else standard template | ||
1520 | - template = panelconfig.template || jsPanel.template; | ||
1521 | - jsP = $(template); | ||
1522 | - | ||
1523 | - // Extend our default config with those provided. Note that the first arg to extend is an empty object - this is to keep from overriding our "defaults" object. | ||
1524 | - jsP.option = $.extend(true, {}, $.jsPanel.defaults, optConfig, panelconfig); | ||
1525 | - | ||
1526 | - // option.id --------------------------------------------------------------------------------------------------- | ||
1527 | - if (typeof jsP.option.id === "string") { | ||
1528 | - id = jsP.option.id; | ||
1529 | - } else if ($.isFunction(jsP.option.id)) { | ||
1530 | - id = jsP.option.id(); | ||
1531 | - } else { | ||
1532 | - jsPanel.ID += 1; | ||
1533 | - id = jsPanel.ID; | ||
1534 | - } | ||
1535 | - if ($("#" + id).length > 0) { | ||
1536 | - alert("jsPanel Error: No jsPanel created - id attribute passed with option.id already exists in document"); | ||
1537 | - return false; | ||
1538 | - } else { | ||
1539 | - jsP.attr("id", id); | ||
1540 | - } | ||
1541 | - | ||
1542 | - jsP.data("custom", jsP.option.custom); | ||
1543 | - | ||
1544 | - jsP.verticalOffset = 0; // always use 0 ... not "0" ! | ||
1545 | - | ||
1546 | - try { | ||
1547 | - jsP.parentElmt = $(jsP.option.selector).first(); | ||
1548 | - jsP.parentElmtTagname = jsP.parentElmt[0].tagName.toLowerCase(); | ||
1549 | - jsP.count = jsP.parentElmt.children('.jsPanel').length; | ||
1550 | - } catch (e) { | ||
1551 | - alert(e + "\n\nThe element you want to append the jsPanel to does not exist!\n\n The jsPanel will be appended to the body element instead."); | ||
1552 | - jsP.option.selector = 'body'; | ||
1553 | - jsP.parentElmt = $('body'); | ||
1554 | - jsP.parentElmtTagname = 'body'; | ||
1555 | - jsP.count = jsP.parentElmt.children('.jsPanel').length; | ||
1556 | - } | ||
1557 | - | ||
1558 | - jsP.status = "initialized"; | ||
1559 | - | ||
1560 | - jsP.header = $('.jsPanel-hdr', jsP); | ||
1561 | - | ||
1562 | - jsP.header.title = $('.jsPanel-title', jsP.header); | ||
1563 | - | ||
1564 | - jsP.header.controls = $('.jsPanel-hdr-r', jsP.header); | ||
1565 | - | ||
1566 | - jsP.header.toolbar = $('.jsPanel-hdr-toolbar', jsP.header); | ||
1567 | - | ||
1568 | - jsP.content = $('.jsPanel-content', jsP); | ||
1569 | - | ||
1570 | - jsP.footer = $('.jsPanel-ftr', jsP); | ||
1571 | - | ||
1572 | - jsP.normalize = function () { | ||
1573 | - jsPanel.normalize(jsP); | ||
1574 | - return jsP; | ||
1575 | - }; | ||
1576 | - | ||
1577 | - jsP.close = function () { | ||
1578 | - // alert('1') | ||
1579 | - jsPanel.close(jsP); | ||
1580 | - // no need to return something | ||
1581 | - }; | ||
1582 | - | ||
1583 | - jsP.closeChildpanels = function () { | ||
1584 | - jsPanel.closeChildpanels(jsP); | ||
1585 | - return jsP; | ||
1586 | - }; | ||
1587 | - | ||
1588 | - jsP.minimize = function () { | ||
1589 | - jsPanel.minimize(jsP); | ||
1590 | - return jsP; | ||
1591 | - }; | ||
1592 | - | ||
1593 | - jsP.maximize = function () { | ||
1594 | - jsPanel.maximize(jsP); | ||
1595 | - return jsP; | ||
1596 | - }; | ||
1597 | - | ||
1598 | - jsP.smallify = function () { | ||
1599 | - if ((jsP.status === "normalized" || jsP.option.panelstatus === "normalized") || (jsP.status === "maximized" || jsP.option.panelstatus === "maximized")) { | ||
1600 | - jsPanel.smallify(jsP); | ||
1601 | - } else if ((jsP.status !== "minimized" || jsP.option.panelstatus !== "minimized")) { | ||
1602 | - jsPanel.unsmallify(jsP); | ||
1603 | - } | ||
1604 | - return jsP; | ||
1605 | - }; | ||
1606 | - | ||
1607 | - jsP.front = function () { | ||
1608 | - jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1609 | - return jsP; | ||
1610 | - }; | ||
1611 | - | ||
1612 | - jsP.title = function (text) { | ||
1613 | - if (text && typeof text === "string") { | ||
1614 | - jsP.header.title.html(text); | ||
1615 | - return jsP; | ||
1616 | - } else if (arguments.length === 0) { | ||
1617 | - return jsP.header.title.html(); | ||
1618 | - } | ||
1619 | - }; | ||
1620 | - | ||
1621 | - jsP.addToolbar = function (place, items) { | ||
1622 | - jsPanel.addToolbar(jsP, place, items); | ||
1623 | - return jsP; | ||
1624 | - }; | ||
1625 | - | ||
1626 | - jsP.control = function (action, btn) { | ||
1627 | - jsPanel.control(jsP, action, btn); | ||
1628 | - return jsP; | ||
1629 | - }; | ||
1630 | - | ||
1631 | - jsP.resize = function (width, height) { | ||
1632 | - // alert('jsP.resize') | ||
1633 | - // method resizes the full panel (not content section only) | ||
1634 | - jsPanel.resize(jsP, width, height); | ||
1635 | - return jsP; | ||
1636 | - }; | ||
1637 | - | ||
1638 | - jsP.reposition = function (position, selector) { | ||
1639 | - jsPanel.reposition(jsP, position, selector); | ||
1640 | - return jsP; | ||
1641 | - }; | ||
1642 | - | ||
1643 | - jsP.reloadContent = function () { | ||
1644 | - if (jsP.option.content) { | ||
1645 | - jsP.content.empty().append(jsP.option.content); | ||
1646 | - } else if (jsP.option.load) { | ||
1647 | - jsP.content.empty(); | ||
1648 | - jsPanel.load(jsP); | ||
1649 | - } else if (jsP.option.ajax) { | ||
1650 | - jsPanel.ajax(jsP); | ||
1651 | - } else if (jsP.option.iframe) { | ||
1652 | - jsPanel.iframe(jsP); | ||
1653 | - } | ||
1654 | - }; | ||
1655 | - | ||
1656 | - // handler to move panel to foreground on click | ||
1657 | - jsP.on('click', function (e) { | ||
1658 | - //alert('1') | ||
1659 | - // use of e.preventDefault(); would prevent events from inside a panel from firing properly | ||
1660 | - if (!$(e.target).is("a[href], button, .jsPanel-nofront, .jsPanel-nofront *")) { | ||
1661 | - if (!jsP.hasClass("jsPanel-modal")) { | ||
1662 | - jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1663 | - } | ||
1664 | - } | ||
1665 | - }); | ||
1666 | - | ||
1667 | - // jsPanel close | ||
1668 | - $('.jsPanel-btn-close', jsP).on('click', function (e) { | ||
1669 | - // alert('2') | ||
1670 | - e.preventDefault(); | ||
1671 | - //if (!jsP.option.controls.confirmClose) { | ||
1672 | - // jsPanel.close(jsP, jsP.parentElmtTagname); | ||
1673 | - //} else { | ||
1674 | - // if (window.confirm(jsP.option.controls.confirmClose) === true) { | ||
1675 | - // jsPanel.close(jsP, jsP.parentElmtTagname); | ||
1676 | - // } | ||
1677 | - //} | ||
1678 | - | ||
1679 | - | ||
1680 | - var $scope = jsPanel.getRootScope('HomeController'); | ||
1681 | - $scope.openParent(jsP.option.parentSlug); | ||
1682 | - $scope.$apply(); | ||
1683 | - }); | ||
1684 | - | ||
1685 | - | ||
1686 | - | ||
1687 | - | ||
1688 | - // jsPanel minimize | ||
1689 | - $('.jsPanel-btn-min', jsP).on('click', function (e) { | ||
1690 | - // alert('minimized') | ||
1691 | - | ||
1692 | - e.preventDefault(); | ||
1693 | - jsPanel.minimize(jsP); | ||
1694 | - // debugger; | ||
1695 | - var headerTitle = $('.jsPanel-title'); | ||
1696 | - var title = headerTitle[0].innerHTML; | ||
1697 | - | ||
1698 | - var $rootscope = jsPanel.getRootScope('HomeController'); | ||
1699 | - //$rootscope.openParent(jsP.option.parentSlug); | ||
1700 | - $rootscope.setState('min', title); | ||
1701 | - $rootscope.$apply(); | ||
1702 | - | ||
1703 | - var currentController = jsP.option.currentController; | ||
1704 | - if (currentController == 'DAController') { | ||
1705 | - var $scope = jsPanel.getScope(currentController); | ||
1706 | - var canvasDiv = document.getElementById('canvasDiv'); | ||
1707 | - $scope.imageVerticalScrollPosition = canvasDiv.scrollTop; | ||
1708 | - $scope.imageHorizontlScrollPosition = canvasDiv.scrollLeft; | ||
1709 | - $scope.$apply(); | ||
1710 | - } | ||
1711 | - }); | ||
1712 | - | ||
1713 | - // jsPanel maximize | ||
1714 | - $('.jsPanel-btn-max', jsP).on('click', function (e) { | ||
1715 | - // debugger; | ||
1716 | - e.preventDefault(); | ||
1717 | - jsPanel.maximize(jsP); | ||
1718 | - | ||
1719 | - $('.jsPanel-btn-min').css('display', 'initial'); | ||
1720 | - $('.fa fa-minus').css('display', 'initial'); | ||
1721 | - | ||
1722 | - | ||
1723 | - | ||
1724 | - var headerTitle = $('.jsPanel-title'); | ||
1725 | - var title = headerTitle[0].innerHTML; | ||
1726 | - var $rootscope = jsPanel.getRootScope('HomeController'); | ||
1727 | - $rootscope.setState('max', title); | ||
1728 | - $rootscope.$apply(); | ||
1729 | - }); | ||
1730 | - | ||
1731 | - // jsPanel normalize | ||
1732 | - $('.jsPanel-btn-norm', jsP).on('click', function (e) { | ||
1733 | - // debugger; | ||
1734 | - e.preventDefault(); | ||
1735 | - jsPanel.normalize(jsP); | ||
1736 | - | ||
1737 | - var currentController = jsP.option.currentController; | ||
1738 | - if (currentController == 'DAController') { | ||
1739 | - var $scope = jsPanel.getScope(currentController); | ||
1740 | - | ||
1741 | - | ||
1742 | - $('#canvasDiv').scrollLeft($scope.imageHorizontlScrollPosition) | ||
1743 | - $('#canvasDiv').scrollTop($scope.imageVerticalScrollPosition) | ||
1744 | - | ||
1745 | - $scope.$apply(); | ||
1746 | - } | ||
1747 | - }); | ||
1748 | - | ||
1749 | - // jsPanel smallify | ||
1750 | - $('.jsPanel-btn-small', jsP).on('click', function (e) { | ||
1751 | - e.preventDefault(); | ||
1752 | - jsPanel.smallify(jsP); | ||
1753 | - }); | ||
1754 | - | ||
1755 | - // jsPanel unsmallify | ||
1756 | - $('.jsPanel-btn-smallrev', jsP).on('click', function (e) { | ||
1757 | - e.preventDefault(); | ||
1758 | - jsPanel.unsmallify(jsP); | ||
1759 | - }); | ||
1760 | - | ||
1761 | - // rewrite option.paneltype strings to objects and set defaults for option.paneltype | ||
1762 | - jsP.option.paneltype = jsPanel.rewriteOPaneltype(jsP.option.paneltype); | ||
1763 | - | ||
1764 | - // converts option.position string to object | ||
1765 | - jsP.option.position = jsPanel.rewriteOPosition(jsP.option.position); | ||
1766 | - | ||
1767 | - // converts option.size string to object | ||
1768 | - jsP.option.size = jsPanel.rewriteOSize(jsP.option.size); | ||
1769 | - | ||
1770 | - /* option.paneltype - override or set various settings depending on option.paneltype ------------------------ */ | ||
1771 | - if (jsP.option.paneltype.type === 'modal') { | ||
1772 | - // set defaults for standard modal | ||
1773 | - jsPanel.setModalDefaults(jsP); | ||
1774 | - // insert backdrop | ||
1775 | - if ($('.jsPanel-backdrop').length < 1) { | ||
1776 | - jsPanel.insertModalBackdrop(); | ||
1777 | - } | ||
1778 | - } else if (jsP.option.paneltype.type === 'tooltip') { | ||
1779 | - jsPanel.setTooltipDefaults(jsP); | ||
1780 | - // optionally remove all other tooltips | ||
1781 | - if (jsP.option.paneltype.solo) { | ||
1782 | - jsPanel.closeallTooltips(); | ||
1783 | - } | ||
1784 | - // calc top & left for the various tooltip positions | ||
1785 | - jsP.option.position = jsPanel.calcToooltipPosition(jsP.parentElmt, jsP.option); | ||
1786 | - // position the tooltip & add tooltip class | ||
1787 | - jsP.css({ | ||
1788 | - top: jsP.option.position.top, | ||
1789 | - left: jsP.option.position.left | ||
1790 | - }); | ||
1791 | - if (!jsP.parentElmt.parent().hasClass('jsPanel-tooltip-wrapper')) { | ||
1792 | - // wrap element serving as trigger in a div - will take the tooltip | ||
1793 | - jsP.parentElmt.wrap('<div class="jsPanel-tooltip-wrapper">'); | ||
1794 | - // append tooltip (jsPanel) to the wrapper div | ||
1795 | - jsP.parentElmt.parent().append(jsP); | ||
1796 | - if (jsP.option.paneltype.mode === 'semisticky') { | ||
1797 | - jsP.hover( | ||
1798 | - function () { | ||
1799 | - $.noop(); | ||
1800 | - }, | ||
1801 | - function () { | ||
1802 | - jsPanel.close(jsP); | ||
1803 | - } | ||
1804 | - ); | ||
1805 | - } else if (jsP.option.paneltype.mode === 'sticky') { | ||
1806 | - $.noop(); | ||
1807 | - } else { | ||
1808 | - jsP.option.controls.buttons = 'none'; | ||
1809 | - // tooltip will be removed whenever mouse leaves trigger | ||
1810 | - jsP.parentElmt.off('mouseout'); // to prevent mouseout from firing several times | ||
1811 | - jsP.parentElmt.mouseout(function () { | ||
1812 | - jsPanel.close(jsP); | ||
1813 | - }); | ||
1814 | - } | ||
1815 | - } | ||
1816 | - // corners | ||
1817 | - jsP.css('overflow', 'visible'); | ||
1818 | - if (jsP.option.paneltype.cornerBG) { | ||
1819 | - var corner = $("<div></div>"), | ||
1820 | - cornerLoc = "jsPanel-corner-" + jsP.option.paneltype.position, | ||
1821 | - cornerPos, | ||
1822 | - cornerOX = parseInt(jsP.option.paneltype.cornerOX) || 0, | ||
1823 | - cornerOY = parseInt(jsP.option.paneltype.cornerOY) || 0, | ||
1824 | - cornerBG = jsP.option.paneltype.cornerBG; | ||
1825 | - if (jsP.option.paneltype.position !== "bottom") { | ||
1826 | - corner.addClass("jsPanel-corner " + cornerLoc).appendTo(jsP); | ||
1827 | - } else { | ||
1828 | - corner.addClass("jsPanel-corner " + cornerLoc).prependTo(jsP); | ||
1829 | - } | ||
1830 | - if (jsP.option.paneltype.position === "top") { | ||
1831 | - cornerPos = parseInt(jsP.option.size.width) / 2 - 12 + (cornerOX) + "px"; | ||
1832 | - corner.css({ borderTopColor: cornerBG, left: cornerPos }); | ||
1833 | - } else if (jsP.option.paneltype.position === "right") { | ||
1834 | - cornerPos = parseInt(jsP.option.size.height) / 2 - 12 + (cornerOY) + "px"; | ||
1835 | - corner.css({ borderRightColor: cornerBG, left: "-22px", top: cornerPos }); | ||
1836 | - } else if (jsP.option.paneltype.position === "bottom") { | ||
1837 | - cornerPos = parseInt(jsP.option.size.width) / 2 - 12 + (cornerOX) + "px"; | ||
1838 | - corner.css({ borderBottomColor: cornerBG, left: cornerPos, top: "-22px" }); | ||
1839 | - } else if (jsP.option.paneltype.position === "left") { | ||
1840 | - cornerPos = parseInt(jsP.option.size.height) / 2 - 12 + (cornerOY) + "px"; | ||
1841 | - corner.css({ borderLeftColor: cornerBG, left: jsP.option.size.width, top: cornerPos }); | ||
1842 | - } | ||
1843 | - } | ||
1844 | - } else if (jsP.option.paneltype.type === 'hint') { | ||
1845 | - jsPanel.setHintDefaults(jsP); | ||
1846 | - // bind callback for close button | ||
1847 | - $('.jsPanel-hint-close', jsP).on('click', jsP, function (event) { | ||
1848 | - event.data.close(jsP); | ||
1849 | - }); | ||
1850 | - // set option.position for hints using 'top left', 'top center' or 'top right' | ||
1851 | - if (jsP.option.position.top === '0' && jsP.option.position.left === 'center') { | ||
1852 | - jsP.addClass("jsPanel-hint-tc"); | ||
1853 | - if ($(".jsPanel-hint-tc").length > 0) { | ||
1854 | - jsP.option.position = jsPanel.hintTop("jsPanel-hint-tc"); | ||
1855 | - } | ||
1856 | - } else if (jsP.option.position.top === '0' && jsP.option.position.left === '0') { | ||
1857 | - jsP.addClass("jsPanel-hint-tl"); | ||
1858 | - if ($(".jsPanel-hint-tl").length > 0) { | ||
1859 | - jsP.option.position = jsPanel.hintTop("jsPanel-hint-tl"); | ||
1860 | - } | ||
1861 | - } else if (jsP.option.position.top === '0' && jsP.option.position.right === '0') { | ||
1862 | - jsP.addClass("jsPanel-hint-tr"); | ||
1863 | - if ($(".jsPanel-hint-tr").length > 0) { | ||
1864 | - jsP.option.position = jsPanel.hintTop("jsPanel-hint-tr"); | ||
1865 | - } | ||
1866 | - } | ||
1867 | - } | ||
1868 | - | ||
1869 | - /* option.selector - append jsPanel only to the first object in selector ------------------------------------ */ | ||
1870 | - jsP.data("selector", jsP.option.selector); // needed for exportPanels() | ||
1871 | - if (jsP.option.paneltype.type !== 'tooltip') { | ||
1872 | - jsP.appendTo(jsP.parentElmt); | ||
1873 | - } | ||
1874 | - if (jsP.option.paneltype.type === 'modal') { | ||
1875 | - jsP.css('zIndex', 10001); | ||
1876 | - if (jsP.option.paneltype.mode === 'extended') { | ||
1877 | - $('.jsPanel-backdrop').css('z-index', '9998'); | ||
1878 | - } | ||
1879 | - } else { | ||
1880 | - if (!jsP.hasClass("jsPanel-modal")) { | ||
1881 | - jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1882 | - } | ||
1883 | - } | ||
1884 | - | ||
1885 | - /* option.bootstrap & option.theme -------------------------------------------------------------------------- */ | ||
1886 | - if (jsP.option.bootstrap) { | ||
1887 | - // check whether a bootstrap compatible theme is used and set option.theme accordingly | ||
1888 | - jsP.option.theme = jsPanel.isBootstrapTheme(jsP.option.bootstrap); | ||
1889 | - jsP.option.controls.iconfont = 'bootstrap'; | ||
1890 | - jsP.alterClass('jsPanel-theme-*', 'panel panel-' + jsP.option.theme); | ||
1891 | - jsP.header.alterClass('jsPanel-theme-*', 'panel-heading'); | ||
1892 | - jsP.header.title.addClass('panel-title'); | ||
1893 | - jsP.content.alterClass('jsPanel-theme-*', 'panel-body'); | ||
1894 | - jsP.footer.addClass('panel-footer'); | ||
1895 | - // fix css problems for panels nested in other bootstrap panels | ||
1896 | - jsP.header.title.css('color', function () { | ||
1897 | - return jsP.header.css('color'); | ||
1898 | - }); | ||
1899 | - jsP.content.css('border-top-color', function () { | ||
1900 | - return jsP.header.css('border-top-color'); | ||
1901 | - }); | ||
1902 | - } else { | ||
1903 | - // activate normal non bootstrap themes | ||
1904 | - var components = [jsP, jsP.header, jsP.content, jsP.footer]; | ||
1905 | - components.forEach(function (elmt) { | ||
1906 | - $(elmt).alterClass('jsPanel-theme-*', 'jsPanel-theme-' + jsP.option.theme); | ||
1907 | - }); | ||
1908 | - } | ||
1909 | - | ||
1910 | - /* option.removeHeader; option.controls (buttons in header right) ------------------------------------------- */ | ||
1911 | - if (jsP.option.removeHeader) { | ||
1912 | - jsP.header.remove(); | ||
1913 | - } else { | ||
1914 | - jsPanel.configControls(jsP); | ||
1915 | - } | ||
1916 | - | ||
1917 | - /* insert iconfonts if option.iconfont set (default is "jsglyph") */ | ||
1918 | - if (jsP.option.controls.iconfont) { | ||
1919 | - jsPanel.configIconfont(jsP); | ||
1920 | - } else { | ||
1921 | - // if option.controls.iconfont === false restore old icon sprite | ||
1922 | - $('.jsPanel-btn-close, .jsPanel-btn-max, .jsPanel-btn-norm, .jsPanel-btn-min, .jsPanel-btn-small, .jsPanel-btn-smallrev', jsP.header.controls).empty(); | ||
1923 | - } | ||
1924 | - | ||
1925 | - /* option.toolbarHeader | default: false -------------------------------------------------------------------- */ | ||
1926 | - if (jsP.option.toolbarHeader && jsP.option.removeHeader === false) { | ||
1927 | - if (typeof jsP.option.toolbarHeader === 'string') { | ||
1928 | - jsP.header.toolbar.append(jsP.option.toolbarHeader); | ||
1929 | - } else if ($.isFunction(jsP.option.toolbarHeader)) { | ||
1930 | - jsP.header.toolbar.append(jsP.option.toolbarHeader(jsP.header)); | ||
1931 | - } else if ($.isArray(jsP.option.toolbarHeader)) { | ||
1932 | - jsPanel.configToolbar(jsP.option.toolbarHeader, jsP.header.toolbar, jsP); | ||
1933 | - } | ||
1934 | - // give toolbar the same font-family as title | ||
1935 | - jsP.header.toolbar.css("font-family", jsP.header.title.css("font-family")); | ||
1936 | - } | ||
1937 | - | ||
1938 | - /* option.toolbarFooter | default: false -------------------------------------------------------------------- */ | ||
1939 | - if (jsP.option.toolbarFooter) { | ||
1940 | - jsP.footer.css({ | ||
1941 | - display: 'block' | ||
1942 | - }); | ||
1943 | - if (typeof jsP.option.toolbarFooter === 'string') { | ||
1944 | - jsP.footer.append(jsP.option.toolbarFooter); | ||
1945 | - } else if ($.isFunction(jsP.option.toolbarFooter)) { | ||
1946 | - jsP.footer.append(jsP.option.toolbarFooter(jsP.footer)); | ||
1947 | - } else if ($.isArray(jsP.option.toolbarFooter)) { | ||
1948 | - jsPanel.configToolbar(jsP.option.toolbarFooter, jsP.footer, jsP); | ||
1949 | - } | ||
1950 | - // give toolbar the same font-family as title | ||
1951 | - jsP.footer.css("font-family", jsP.header.title.css("font-family")); | ||
1952 | - } | ||
1953 | - | ||
1954 | - /* option.rtl | default: false ------------------------------------------------------------------------------ */ | ||
1955 | - if (jsP.option.rtl.rtl === true) { | ||
1956 | - jsPanel.setRTL(jsP, jsP.option.rtl.lang); | ||
1957 | - } | ||
1958 | - | ||
1959 | - /* option.overflow | default: 'hidden' --------------------------------------------------------------------- */ | ||
1960 | - if (typeof jsP.option.overflow === 'string') { | ||
1961 | - jsP.content.css('overflow', jsP.option.overflow); | ||
1962 | - } else if ($.isPlainObject(jsP.option.overflow)) { | ||
1963 | - jsP.content.css({ | ||
1964 | - 'overflow-y': jsP.option.overflow.vertical, | ||
1965 | - 'overflow-x': jsP.option.overflow.horizontal | ||
1966 | - }); | ||
1967 | - } | ||
1968 | - | ||
1969 | - /* option.draggable ----------------------------------------------------------------------------------------- */ | ||
1970 | - if ($.isPlainObject(jsP.option.draggable)) { | ||
1971 | - // if jsPanel is childpanel | ||
1972 | - if (jsP.parent().hasClass('jsPanel-content')) { | ||
1973 | - jsP.option.draggable.containment = 'parent'; | ||
1974 | - } | ||
1975 | - // merge draggable settings and apply | ||
1976 | - jsP.option.customdraggable = $.extend(true, {}, $.jsPanel.defaults.draggable, jsP.option.draggable); | ||
1977 | - jsP.draggable(jsP.option.customdraggable); | ||
1978 | - } else if (jsP.option.draggable === 'disabled') { | ||
1979 | - // reset cursor, draggable deactivated | ||
1980 | - $('.jsPanel-title, .jsPanel-ftr', jsP).css('cursor', 'inherit'); | ||
1981 | - // jquery ui draggable initialize disabled to allow to query status | ||
1982 | - jsP.draggable({ disabled: true }); | ||
1983 | - } | ||
1984 | - | ||
1985 | - /* option.resizable ----------------------------------------------------------------------------------------- */ | ||
1986 | - if ($.isPlainObject(jsP.option.resizable)) { | ||
1987 | - jsP.option.customresizable = $.extend(true, {}, $.jsPanel.defaults.resizable, jsP.option.resizable); | ||
1988 | - jsP.resizable(jsP.option.customresizable); | ||
1989 | - } else if (jsP.option.resizable === 'disabled') { | ||
1990 | - // jquery ui resizable initialize disabled to allow to query status | ||
1991 | - jsP.resizable({ disabled: true }); | ||
1992 | - $('.ui-icon-gripsmall-diagonal-se', jsP).css({ 'background-image': 'none', 'text-indent': -9999 }); | ||
1993 | - $('.ui-resizable-handle', jsP).css({ 'cursor': 'inherit' }); | ||
1994 | - } | ||
1995 | - | ||
1996 | - /* option.content ------------------------------------------------------------------------------------------- */ | ||
1997 | - // option.content can be any valid argument for jQuery.append() | ||
1998 | - if (jsP.option.content) { | ||
1999 | - jsP.content.append(jsP.option.content); | ||
2000 | - jsP.data("content", jsP.option.content); | ||
2001 | - } | ||
2002 | - | ||
2003 | - /* option.load ---------------------------------------------------------------------------------------------- */ | ||
2004 | - if ($.isPlainObject(jsP.option.load) && jsP.option.load.url) { | ||
2005 | - jsPanel.load(jsP); | ||
2006 | - } | ||
2007 | - | ||
2008 | - /* option.ajax ---------------------------------------------------------------------------------------------- */ | ||
2009 | - if ($.isPlainObject(jsP.option.ajax) && jsP.option.ajax.url) { | ||
2010 | - jsPanel.ajax(jsP); | ||
2011 | - } | ||
2012 | - | ||
2013 | - /* option.size ---------------------------------------------------------------------------------------------- */ | ||
2014 | - jsP.content.css({ | ||
2015 | - width: jsP.option.size.width || 'auto', | ||
2016 | - height: jsP.option.size.height || 'auto' | ||
2017 | - }); | ||
2018 | - | ||
2019 | - // Important! limit title width; final adjustment follows later; otherwise title might be longer than panel width | ||
2020 | - jsP.header.title.css('width', jsP.content.width() - 90); | ||
2021 | - | ||
2022 | - /* option.iframe -------------------------------------------------------------------------------------------- */ | ||
2023 | - // implemented after option.size because option.size.width/height are either "auto" or pixel values already | ||
2024 | - if ($.isPlainObject(jsP.option.iframe) && (jsP.option.iframe.src || jsP.option.iframe.srcdoc)) { | ||
2025 | - jsPanel.iframe(jsP); | ||
2026 | - } | ||
2027 | - | ||
2028 | - /* option.position ------------------------------------------------------------------------------------------ */ | ||
2029 | - if (jsP.option.paneltype.type !== 'tooltip') { | ||
2030 | - // value "center" not allowed for option.position.bottom & option.position.right -> use top and/or left | ||
2031 | - // finally calculate & position the jsPanel | ||
2032 | - jsPanel.calcPanelposition(jsP); | ||
2033 | - } | ||
2034 | - | ||
2035 | - /* option.addClass ------------------------------------------------------------------------------------------ */ | ||
2036 | - if (typeof jsP.option.addClass.header === 'string') { | ||
2037 | - jsP.header.addClass(jsP.option.addClass.header); | ||
2038 | - } | ||
2039 | - if (typeof jsP.option.addClass.content === 'string') { | ||
2040 | - jsP.content.addClass(jsP.option.addClass.content); | ||
2041 | - } | ||
2042 | - if (typeof jsP.option.addClass.footer === 'string') { | ||
2043 | - jsP.footer.addClass(jsP.option.addClass.footer); | ||
2044 | - } | ||
2045 | - | ||
2046 | - // handlers for doubleclicks ----------------------------------------------------------------------------------- | ||
2047 | - // dblclicks disabled for normal modals, hints and tooltips | ||
2048 | - if (jsP.option.paneltype.mode !== "default") { | ||
2049 | - if (jsP.option.dblclicks) { | ||
2050 | - if (jsP.option.dblclicks.title) { | ||
2051 | - jsP.header.title.on('dblclick', function (e) { | ||
2052 | - e.preventDefault(); | ||
2053 | - jsPanel.dblclickhelper(jsP.option.dblclicks.title, jsP); | ||
2054 | - }); | ||
2055 | - } | ||
2056 | - if (jsP.option.dblclicks.content) { | ||
2057 | - jsP.content.on('dblclick', function (e) { | ||
2058 | - e.preventDefault(); | ||
2059 | - jsPanel.dblclickhelper(jsP.option.dblclicks.content, jsP); | ||
2060 | - }); | ||
2061 | - } | ||
2062 | - if (jsP.option.dblclicks.footer) { | ||
2063 | - jsP.footer.on('dblclick', function (e) { | ||
2064 | - e.preventDefault(); | ||
2065 | - jsPanel.dblclickhelper(jsP.option.dblclicks.footer, jsP); | ||
2066 | - }); | ||
2067 | - } | ||
2068 | - } | ||
2069 | - } | ||
2070 | - | ||
2071 | - /* option.show ---------------------------------------------------------------------------------------------- */ | ||
2072 | - if (!jsP.option.show) { | ||
2073 | - jsP.css({ | ||
2074 | - display: 'block', | ||
2075 | - opacity: 1 | ||
2076 | - }); | ||
2077 | - $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2078 | - $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2079 | - jsP.option.size = { | ||
2080 | - width: jsP.outerWidth(), | ||
2081 | - height: jsP.outerHeight() | ||
2082 | - }; | ||
2083 | - } else if (jsP.option.show.indexOf(" ") === -1) { | ||
2084 | - // if no space is found in "jsP.option.show" -> function anwenden | ||
2085 | - jsP[jsP.option.show]({ | ||
2086 | - done: function () { | ||
2087 | - // trigger custom event | ||
2088 | - $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2089 | - $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2090 | - jsP.option.size = { | ||
2091 | - width: jsP.outerWidth(), | ||
2092 | - height: jsP.outerHeight() | ||
2093 | - }; | ||
2094 | - } | ||
2095 | - }); | ||
2096 | - } else { | ||
2097 | - // does not work with certain combinations of type of animation and positioning | ||
2098 | - jsP.css({ | ||
2099 | - display: 'block', | ||
2100 | - opacity: 1 | ||
2101 | - }); | ||
2102 | - $(jsP).addClass(jsP.option.show); | ||
2103 | - $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2104 | - $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2105 | - jsP.option.size = { | ||
2106 | - width: jsP.outerWidth(), | ||
2107 | - height: jsP.outerHeight() | ||
2108 | - }; | ||
2109 | - } | ||
2110 | - | ||
2111 | - /* needed if a maximized panel in body is normalized again -------------------------------------------------- */ | ||
2112 | - // don't put this under $('body').on('jspanelloaded', function () { ... } | ||
2113 | - jsP.verticalOffset = jsPanel.calcVerticalOffset(jsP) || 0; | ||
2114 | - | ||
2115 | - /* replace bottom/right values with corresponding top/left values if necessary ------------------------------ */ | ||
2116 | - jsPanel.replaceCSSBottomRight(jsP); | ||
2117 | - | ||
2118 | - /* option.title | needs to be late in the file! ------------------------------------------------------------- */ | ||
2119 | - jsP.header.title.empty().prepend(jsP.option.title); | ||
2120 | - jsPanel.resizeTitle(jsP); | ||
2121 | - | ||
2122 | - /* reposition hints while scrolling window, must be after normalization of position ------------------------- */ | ||
2123 | - if (jsP.option.paneltype.type === 'hint') { | ||
2124 | - jsPanel.reposHintsScroll(jsP); | ||
2125 | - } | ||
2126 | - | ||
2127 | - /* reposition jsPanel appended to body while scrolling window ----------------------------------------------- */ | ||
2128 | - if (jsP.parentElmtTagname === 'body' && (jsP.option.paneltype.type !== 'tooltip' || jsP.option.paneltype.type !== 'hint')) { | ||
2129 | - jsPanel.fixPosition(jsP); | ||
2130 | - } | ||
2131 | - | ||
2132 | - /* resizestart & resizestop & dragstop callbacks ------------------------------------------------------------ */ | ||
2133 | - if (!jsP.option.paneltype || jsP.option.paneltype.mode !== 'default') { | ||
2134 | - // not needed for modals, hints and tooltips | ||
2135 | - $(jsP).on("resizestart", function () { | ||
2136 | - $("iframe", jsP.content).css("display", "none"); // on test | ||
2137 | - }); | ||
2138 | - | ||
2139 | - $(jsP).on("resize", function () { | ||
2140 | - // debugger; | ||
2141 | - // jquery ui resize event is also fired when panel is maximized or normalized (on request of Gareth Bult) | ||
2142 | - jsPanel.resizeContent(jsP); | ||
2143 | - jsPanel.resizeTitle(jsP); | ||
2144 | - }); | ||
2145 | - | ||
2146 | - $(jsP).on("resizestop", function () { | ||
2147 | - | ||
2148 | - //alert('resized') | ||
2149 | - jsP.option.size = { | ||
2150 | - width: jsP.outerWidth(), | ||
2151 | - height: jsP.outerHeight() | ||
2152 | - }; | ||
2153 | - if ($('.tools').length> 0) { | ||
2154 | - //nikita | ||
2155 | - if ($('#canvasDiv') != null) { | ||
2156 | - if (jsP.outerHeight() >= 435 && jsP.outerWidth() >= 650) { | ||
2157 | - // alert('resizestop') | ||
2158 | - $('#canvasDiv').css('height', jsP.outerHeight() - 85) | ||
2159 | - $('#canvasDiv').css('width', jsP.outerWidth() - 95) | ||
2160 | - $('#canvasDiv').css('overflow', 'scroll') | ||
2161 | - } | ||
2162 | - else { | ||
2163 | - $('#canvasDiv').css('height', jsP.outerHeight() - 110) | ||
2164 | - $('#canvasDiv').css('width', jsP.outerWidth() - 85) | ||
2165 | - $('#canvasDiv').css('overflow', 'scroll') | ||
2166 | - } | ||
2167 | - } | ||
2168 | - } | ||
2169 | - //nikita | ||
2170 | - // $('#leftToolBar').css('height', jsP.outerWidth()) | ||
2171 | - | ||
2172 | - jsPanel.updateStateProps(jsP, "normalized"); | ||
2173 | - $(jsP).trigger('jspanelnormalized', jsP.attr('id')); | ||
2174 | - $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2175 | - // controls und title zurücksetzen | ||
2176 | - jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", jsP); | ||
2177 | - $("iframe", jsP.content).css("display", "block"); // on test | ||
2178 | - }); | ||
2179 | - | ||
2180 | - $(jsP).on("dragstart", function () { | ||
2181 | - // alert("dragstart") | ||
2182 | - // debugger; | ||
2183 | - // remove window.scroll handler, is added again on dragstop | ||
2184 | - $(window).off('scroll', jsP.jsPanelfixPos); | ||
2185 | - if (jsP.option.paneltype.mode === 'extended') { | ||
2186 | - jsP.css('z-index', '1'); | ||
2187 | - } | ||
2188 | - }); | ||
2189 | - | ||
2190 | - $(jsP).on("dragstop", function () { | ||
2191 | - // alert("dragstop") | ||
2192 | - // debugger; | ||
2193 | - jsP.option.position = { | ||
2194 | - top: jsP.css('top'), | ||
2195 | - left: jsP.css('left') | ||
2196 | - }; | ||
2197 | - jsP.verticalOffset = jsPanel.calcVerticalOffset(jsP) || 0; | ||
2198 | - if (jsP.parentElmtTagname === 'body') { | ||
2199 | - jsPanel.fixPosition(jsP); | ||
2200 | - } | ||
2201 | - }); | ||
2202 | - | ||
2203 | - $(jsP).on("jspanelminimized", function () { | ||
2204 | - jsPanel.hideControls(".jsPanel-btn-min, .jsPanel-btn-small, .jsPanel-btn-smallrev, .jsPanel-btn-hide", jsP); | ||
2205 | - jsPanel.updateStateProps(jsP, "minimized"); | ||
2206 | - $(window).off('scroll', jsP.jsPanelfixPos); | ||
2207 | - }); | ||
2208 | - | ||
2209 | - $(jsP).on("jspanelmaximized", function () { | ||
2210 | - // debugger; | ||
2211 | - jsPanel.resizeContent(jsP); | ||
2212 | - jsPanel.resizeTitle(jsP); | ||
2213 | - jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-smallrev", jsP); | ||
2214 | - jsPanel.updateStateProps(jsP, "maximized"); | ||
2215 | - // additionally trigger the jQuery UI resize event (on request of Gareth Bult) | ||
2216 | - jsP.trigger("resize"); | ||
2217 | - }); | ||
2218 | - | ||
2219 | - $(jsP).on("jspanelnormalized", function () { | ||
2220 | - jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", jsP); | ||
2221 | - jsPanel.resizeTitle(jsP); | ||
2222 | - jsPanel.resizeContent(jsP); | ||
2223 | - jsPanel.updateStateProps(jsP, "normalized"); | ||
2224 | - // additionally trigger the jQuery UI resize event (on request of Gareth Bult) | ||
2225 | - jsP.trigger("resize"); | ||
2226 | - }); | ||
2227 | - | ||
2228 | - } | ||
2229 | - | ||
2230 | - /* option.autoclose | default: false --------------------------------------- */ | ||
2231 | - if (typeof jsP.option.autoclose === 'number' && jsP.option.autoclose > 0) { | ||
2232 | - jsPanel.autoclose(jsP); | ||
2233 | - } | ||
2234 | - | ||
2235 | - /* tooltip corrections ----------------------------------------------------- */ | ||
2236 | - if (jsP.option.paneltype.type === "tooltip" && (jsP.option.paneltype.position === "top" || jsP.option.paneltype.position === "bottom")) { | ||
2237 | - jsPanel.shiftTooltipHorizontal(jsP, jsP.option.paneltype.shiftwithin); | ||
2238 | - } else if (jsP.option.paneltype.position === "left" || jsP.option.paneltype.position === "right") { | ||
2239 | - jsPanel.shiftTooltipVertical(jsP, jsP.option.paneltype.shiftwithin); | ||
2240 | - } | ||
2241 | - | ||
2242 | - /* option.panelstatus --------------------------------------------------------------------------------------- */ | ||
2243 | - if (jsP.option.panelstatus) { | ||
2244 | - switch (jsP.option.panelstatus) { | ||
2245 | - case "minimized": | ||
2246 | - jsPanel.minimize(jsP); | ||
2247 | - break; | ||
2248 | - case "maximized": | ||
2249 | - jsPanel.maximize(jsP); | ||
2250 | - break; | ||
2251 | - case ("smallified"): | ||
2252 | - jsPanel.smallify(jsP); | ||
2253 | - break; | ||
2254 | - case ("smallifiedMax"): | ||
2255 | - jsPanel.maximize(jsP); | ||
2256 | - jsPanel.smallify(jsP); | ||
2257 | - break; | ||
2258 | - } | ||
2259 | - } else { | ||
2260 | - jsPanel.updateStateProps(jsP, "normalized"); | ||
2261 | - } | ||
2262 | - | ||
2263 | - /* jsP.option.callback --------------------------------------------------------- */ | ||
2264 | - if ($.isFunction(jsP.option.callback)) { | ||
2265 | - jsP.option.callback.call(jsP, jsP); | ||
2266 | - } else if ($.isArray(jsP.option.callback)) { | ||
2267 | - jsP.option.callback.forEach(function (item) { | ||
2268 | - if ($.isFunction(item)) { | ||
2269 | - item.call(jsP, jsP); | ||
2270 | - } | ||
2271 | - }); | ||
2272 | - } | ||
2273 | - | ||
2274 | - | ||
2275 | - return jsP; | ||
2276 | - }; | ||
2277 | - | ||
2278 | - /* jsPanel.defaults */ | ||
2279 | - $.jsPanel.defaults = { | ||
2280 | - "addClass": { | ||
2281 | - header: false, | ||
2282 | - content: false, | ||
2283 | - footer: false | ||
2284 | - }, | ||
2285 | - "ajax": { | ||
2286 | - autoload: true | ||
2287 | - }, | ||
2288 | - "autoclose": false, | ||
2289 | - "bootstrap": false, | ||
2290 | - "callback": undefined, | ||
2291 | - "content": false, | ||
2292 | - "controls": { | ||
2293 | - buttons: true, | ||
2294 | - iconfont: 'jsglyph', | ||
2295 | - close: false, | ||
2296 | - confirmClose: false, | ||
2297 | - maximize: false, | ||
2298 | - minimize: false, | ||
2299 | - normalize: false, | ||
2300 | - smallify: false, | ||
2301 | - maxtoScreen: false | ||
2302 | - }, | ||
2303 | - "custom": false, | ||
2304 | - "dblclicks": false, | ||
2305 | - "draggable": { | ||
2306 | - handle: 'div.jsPanel-hdr, div.jsPanel-ftr', | ||
2307 | - stack: '.jsPanel', | ||
2308 | - opacity: 0.7 | ||
2309 | - }, | ||
2310 | - "id": function () { | ||
2311 | - jsPanel.ID += 1; | ||
2312 | - return 'jsPanel-' + jsPanel.ID; | ||
2313 | - }, | ||
2314 | - "iframe": false, | ||
2315 | - "load": false, | ||
2316 | - "maximizedMargin": { | ||
2317 | - top: 5, | ||
2318 | - right: 5, | ||
2319 | - bottom: 5, | ||
2320 | - left: 5 | ||
2321 | - }, | ||
2322 | - "offset": { | ||
2323 | - top: 0, | ||
2324 | - left: 0 | ||
2325 | - }, | ||
2326 | - "onbeforeclose": false, | ||
2327 | - "onbeforemaximize": false, | ||
2328 | - "onbeforeminimize": false, | ||
2329 | - "onbeforenormalize": false, | ||
2330 | - "onclosed": false, | ||
2331 | - "oncmaximized": false, | ||
2332 | - "onminimized": false, | ||
2333 | - "onnormalized": false, | ||
2334 | - "overflow": 'hidden', | ||
2335 | - "panelstatus": false, | ||
2336 | - "paneltype": false, | ||
2337 | - "position": 'auto', | ||
2338 | - "removeHeader": false, | ||
2339 | - "resizable": { | ||
2340 | - handles: 'n, e, s, w, ne, se, sw, nw', | ||
2341 | - autoHide: false, | ||
2342 | - minWidth: 150, | ||
2343 | - minHeight: 93 | ||
2344 | - }, | ||
2345 | - "rtl": false, | ||
2346 | - "selector": 'body', | ||
2347 | - "show": 'fadeIn', | ||
2348 | - "size": { | ||
2349 | - width: '400px', | ||
2350 | - height: '222px' | ||
2351 | - }, | ||
2352 | - "template": false, | ||
2353 | - "theme": 'default', | ||
2354 | - "title": 'jsPanel', | ||
2355 | - "toolbarFooter": false, | ||
2356 | - "toolbarHeader": false, | ||
2357 | - "currentController": '', | ||
2358 | - "parentSlug": '' | ||
2359 | - | ||
2360 | - }; | ||
2361 | - | ||
2362 | - | ||
2363 | - /* | ||
2364 | - * jQuery alterClass plugin | ||
2365 | - * Remove element classes with wildcard matching. Optionally add classes: | ||
2366 | - * $( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) | ||
2367 | - * Copyright (c) 2011 Pete Boere (the-echoplex.net) | ||
2368 | - * Free under terms of the MIT license: http://www.opensource.org/licenses/mit-license.php | ||
2369 | - */ | ||
2370 | - $.fn.alterClass = function (removals, additions) { | ||
2371 | - | ||
2372 | - var self = this, | ||
2373 | - patt; | ||
2374 | - if (removals.indexOf('*') === -1) { | ||
2375 | - // Use native jQuery methods if there is no wildcard matching | ||
2376 | - self.removeClass(removals); | ||
2377 | - return !additions ? self : self.addClass(additions); | ||
2378 | - } | ||
2379 | - patt = new RegExp('\\s' + | ||
2380 | - removals.replace(/\*/g, '[A-Za-z0-9-_]+').split(' ').join('\\s|\\s') + | ||
2381 | - '\\s', 'g'); | ||
2382 | - self.each(function (i, it) { | ||
2383 | - var cn = ' ' + it.className + ' '; | ||
2384 | - while (patt.test(cn)) { | ||
2385 | - cn = cn.replace(patt, ' '); | ||
2386 | - } | ||
2387 | - it.className = $.trim(cn); | ||
2388 | - }); | ||
2389 | - return !additions ? self : self.addClass(additions); | ||
2390 | - }; | ||
2391 | - | ||
2392 | - /* body click handler: remove all tooltips on click in body except click is inside tooltip */ | ||
2393 | - $('body').click(function (e) { | ||
2394 | - var pID, | ||
2395 | - isTT = $(e.target).closest('.jsPanel-tt').length; | ||
2396 | - if (isTT < 1) { | ||
2397 | - $('.jsPanel-tt').each(function () { | ||
2398 | - pID = $(this).attr('id'); | ||
2399 | - // if present remove tooltip wrapper and than remove tooltip | ||
2400 | - $('#' + pID).unwrap().remove(); | ||
2401 | - $('body').trigger('jspanelclosed', pID); | ||
2402 | - }); | ||
2403 | - } | ||
2404 | - }); | ||
2405 | - | ||
2406 | - | ||
2407 | - | ||
2408 | - | ||
2409 | -}(jQuery)); | ||
2410 | - | ||
2411 | -/* | ||
2412 | - :: Number.isInteger() polyfill :: | ||
2413 | - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger | ||
2414 | -*/ | ||
2415 | -if (!Number.isInteger) { | ||
2416 | - Number.isInteger = function isInteger(nVal) { | ||
2417 | - "use strict"; | ||
2418 | - return typeof nVal === 'number' && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; | ||
2419 | - }; | 1 | +/// <reference path="../vendor/mobile-detect.js" /> |
2 | +/// <reference path="../../../../../index.html" /> | ||
3 | +/// <reference path="../../../../../index.html" /> | ||
4 | +/* global console, MobileDetect, jQuery */ | ||
5 | +/* jQuery Plugin jsPanel | ||
6 | + Dependencies: | ||
7 | + jQuery library ( > 1.9.1 incl. 2.1.3 ) | ||
8 | + jQuery.UI library ( > 1.9.2 ) - (at least UI Core, Mouse, Widget, Draggable, Resizable) | ||
9 | + HTML5/CSS3 compatible browser | ||
10 | + | ||
11 | + Copyright (c) 2014-15 Stefan Sträßer, <http://stefanstraesser.eu/> | ||
12 | + | ||
13 | + Permission is hereby granted, free of charge, to any person obtaining a copy | ||
14 | + of this software and associated documentation files (the "Software"), to deal | ||
15 | + in the Software without restriction, including without limitation the rights | ||
16 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
17 | + copies of the Software, and to permit persons to whom the Software is | ||
18 | + furnished to do so, subject to the following conditions: | ||
19 | + | ||
20 | + The above copyright notice and this permission notice shall be included in | ||
21 | + all copies or substantial portions of the Software. | ||
22 | + | ||
23 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
24 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
25 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
26 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
27 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
28 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
29 | + THE SOFTWARE. | ||
30 | + | ||
31 | + <http://opensource.org/licenses/MIT>. | ||
32 | + | ||
33 | + CHANGES IN 2.6.0: | ||
34 | + + new options onbeforeclose, onclosed | ||
35 | + + new options onbeforemaximize, onmaximized | ||
36 | + + new options onbeforeminimize, onminimized | ||
37 | + + new options onbefornormalize, onnormalized | ||
38 | + */ | ||
39 | + | ||
40 | +"use strict"; | ||
41 | +// check for jQuery and jQuery UI components | ||
42 | +if (!$.fn.jquery || !$.fn.uniqueId || !$.widget || !$.ui.mouse || !$.ui.draggable || !$.ui.resizable) { | ||
43 | + console.log("Error: jQuery or at least one jQuery UI component is not loaded! You need at least jQuery 1.9.1 and jQuery UI 1.9.2 (modules Core, Mouse, Widget, Draggable and Resizable)."); | ||
44 | +} else { | ||
45 | + console.log("Loaded: jQuery " + $.fn.jquery + ", jQuery UI " + $.ui.version + | ||
46 | + "\nUI core: " + $.isFunction($.fn.uniqueId) + ", UI widget: " + $.isFunction($.widget) + ", UI mouse: " + $.isFunction($.ui.mouse) + | ||
47 | + ", UI draggable: " + $.isFunction($.ui.draggable) + ", UI resizable: " + $.isFunction($.ui.resizable)); | ||
48 | +} | ||
49 | + | ||
50 | +var jsPanel = { | ||
51 | + | ||
52 | + version: '2.6.0 2015-12-04 14:15', | ||
53 | + device: (function () { | ||
54 | + try { | ||
55 | + var imported = document.createElement('script'); | ||
56 | + //imported.src = '//vendor/mobile-detect.js'; | ||
57 | + imported.src = '~/../libs/jquery/jquery_plugin/jsPanel/vendor/mobile-detect.js'; | ||
58 | + document.head.appendChild(imported); | ||
59 | + | ||
60 | + // requires "mobile-detect.js" to be loaded | ||
61 | + var md = new MobileDetect(window.navigator.userAgent), | ||
62 | + mobile = md.mobile(), | ||
63 | + phone = md.phone(), | ||
64 | + tablet = md.tablet(), | ||
65 | + os = md.os(), | ||
66 | + userAgent = md.userAgent(); | ||
67 | + return { mobile: mobile, tablet: tablet, phone: phone, os: os, userAgent: userAgent }; | ||
68 | + } catch (e) { | ||
69 | + console.log(e + "; Seems like mobile-detect.js is not loaded"); | ||
70 | + return { mobile: undefined, tablet: undefined, phone: undefined, os: undefined, userAgent: undefined }; | ||
71 | + } | ||
72 | + })(), | ||
73 | + ID: 0, // kind of a counter to add to automatically generated id attribute | ||
74 | + widthForMinimized: 180, // default width of minimized panels | ||
75 | + template: '<div class="jsPanel jsPanel-theme-default jsPanel-state-initialized">' + | ||
76 | + '<div class="jsPanel-hdr jsPanel-theme-default">' + | ||
77 | + '<h3 class="jsPanel-title"></h3>' + | ||
78 | + '<div class="jsPanel-hdr-r">' + | ||
79 | + '<div class="jsPanel-btn-close "><span class="jsglyph jsglyph-remove"></span></div>' + | ||
80 | + '<div class="jsPanel-btn-max"><span class="jsglyph jsglyph-maximize"></span></div>' + | ||
81 | + '<div class="jsPanel-btn-norm"><span class="jsglyph jsglyph-normalize"></span></div>' + | ||
82 | + '<div class="jsPanel-btn-min"><span id="minSpan" class="fa fa-minus"></span></div>' + | ||
83 | + | ||
84 | + //'<div class="jsPanel-btn-min"><span class="jsglyph jsglyph-minimize"></span></div>' + | ||
85 | + //'<div class="jsPanel-btn-small"><span class="jsglyph jsglyph-chevron-up"></span></div>' + | ||
86 | + //'<div class="jsPanel-btn-smallrev"><span class="jsglyph jsglyph-chevron-down"></span></div>' + | ||
87 | + '</div>' + | ||
88 | + '<div class="jsPanel-hdr-toolbar jsPanel-clearfix"></div>' + | ||
89 | + '</div>' + | ||
90 | + '<div class="jsPanel-content jsPanel-theme-default"></div>' + | ||
91 | + '<div class="jsPanel-ftr jsPanel-theme-default jsPanel-clearfix"></div>' + | ||
92 | + '</div>', | ||
93 | + | ||
94 | + // add toolbar | ||
95 | + addToolbar: function (panel, place, items) { | ||
96 | + if (place === 'header') { | ||
97 | + this.configToolbar(items, panel.header.toolbar, panel); | ||
98 | + } else if (place === 'footer') { | ||
99 | + panel.footer.css({ display: 'block' }); | ||
100 | + this.configToolbar(items, panel.footer, panel); | ||
101 | + } | ||
102 | + // give toolbar the same font-family as title | ||
103 | + panel.header.toolbar.css("font-family", panel.header.title.css("font-family")); | ||
104 | + return panel; | ||
105 | + }, | ||
106 | + | ||
107 | + // loads content using jQuery.ajax(); | ||
108 | + ajax: function (panel) { | ||
109 | + var oAjax = panel.option.ajax, | ||
110 | + pc = panel.content; | ||
111 | + $.ajax(oAjax) | ||
112 | + .done(function (data, textStatus, jqXHR) { | ||
113 | + if (oAjax.autoload && oAjax.url) { | ||
114 | + pc.empty().append(data); | ||
115 | + } | ||
116 | + if ($.isFunction(oAjax.done)) { | ||
117 | + oAjax.done.call(pc, data, textStatus, jqXHR, panel); | ||
118 | + } | ||
119 | + }) | ||
120 | + .fail(function (jqXHR, textStatus, errorThrown) { | ||
121 | + if ($.isFunction(oAjax.fail)) { | ||
122 | + oAjax.fail.call(pc, jqXHR, textStatus, errorThrown, panel); | ||
123 | + } | ||
124 | + }) | ||
125 | + .always(function (arg1, textStatus, arg3) { | ||
126 | + //In response to a successful request, the function's arguments are the same as those of .done(): data(hier: arg1), textStatus, and the jqXHR object(hier: arg3) | ||
127 | + //For failed requests the arguments are the same as those of .fail(): the jqXHR object(hier: arg1), textStatus, and errorThrown(hier: arg3) | ||
128 | + // fix for a bug in jQuery-UI draggable? that causes the jsPanel to reduce width when dragged beyond boundary of containing element and option.size.width is 'auto' | ||
129 | + pc.css('width', function () { | ||
130 | + return pc.outerWidth(); | ||
131 | + }); | ||
132 | + if ($.isFunction(oAjax.always)) { | ||
133 | + oAjax.always.call(pc, arg1, textStatus, arg3, panel); | ||
134 | + } | ||
135 | + // title h3 might be to small: load() is async! | ||
136 | + jsPanel.resizeTitle(panel); | ||
137 | + // update option.size (content might come delayed) | ||
138 | + jsPanel.updateOptionSize(panel, panel.option.size); | ||
139 | + }) | ||
140 | + .then(function (data, textStatus, jqXHR) { | ||
141 | + if (oAjax.then && $.isArray(oAjax.then)) { | ||
142 | + if ($.isFunction(oAjax.then[0])) { | ||
143 | + oAjax.then[0].call(pc, data, textStatus, jqXHR, panel); | ||
144 | + } | ||
145 | + // title h3 might be to small: load() is async! | ||
146 | + jsPanel.resizeTitle(panel); | ||
147 | + // update option.size (content might come delayed) | ||
148 | + jsPanel.updateOptionSize(panel, panel.option.size); | ||
149 | + } | ||
150 | + }, function (jqXHR, textStatus, errorThrown) { | ||
151 | + if (oAjax.then && $.isArray(oAjax.then)) { | ||
152 | + if ($.isFunction(oAjax.then[1])) { | ||
153 | + oAjax.then[1].call(pc, jqXHR, textStatus, errorThrown, panel); | ||
154 | + } | ||
155 | + // title h3 might be to small: load() is async! | ||
156 | + jsPanel.resizeTitle(panel); | ||
157 | + } | ||
158 | + } | ||
159 | + ); | ||
160 | + panel.data("ajaxURL", oAjax.url); // needed for exportPanels() | ||
161 | + }, | ||
162 | + | ||
163 | + // used in option.autoclose and checks prior use of .close() whether the panel is still there | ||
164 | + autoclose: function (panel) { | ||
165 | + window.setTimeout(function () { | ||
166 | + if (panel) { | ||
167 | + panel.fadeOut('slow', function () { | ||
168 | + panel.close(); | ||
169 | + }); | ||
170 | + } | ||
171 | + }, panel.option.autoclose); | ||
172 | + }, | ||
173 | + | ||
174 | + calcPanelposition: function (jsP) { | ||
175 | + // when using option.size = 'auto' and option.position = 'center' consider use of option.ajax with | ||
176 | + // async: false -> size will be known when position is calculated | ||
177 | + // value "center" not allowed for option.position.bottom & option.position.right -> use top and/or left | ||
178 | + var panelpos = {}; | ||
179 | + // get px values for panel size in case option.size is 'auto' - results will be incorrect whenever content | ||
180 | + // is not loaded yet ( e.g. option.load, option.ajax ) -> centering can't work correctly | ||
181 | + jsP.option.size.width = $(jsP).outerWidth(); | ||
182 | + jsP.option.size.height = $(jsP).innerHeight(); | ||
183 | + // delete option.position.top and/or left if option.position.bottom and/or right (top & left values come from defaults object) | ||
184 | + if (jsP.option.position.bottom) { | ||
185 | + delete jsP.option.position.top; | ||
186 | + } | ||
187 | + if (jsP.option.position.right) { | ||
188 | + delete jsP.option.position.left; | ||
189 | + } | ||
190 | + // calculate top | bottom values != center | ||
191 | + // if not checked for 0 as well code would not be executed! | ||
192 | + if (jsP.option.position.bottom || jsP.option.position.bottom === 0) { | ||
193 | + this.calcPos('bottom', jsP); | ||
194 | + } else if (jsP.option.position.top || jsP.option.position.top === 0) { | ||
195 | + if (jsP.option.position.top === 'center') { | ||
196 | + jsP.option.position.top = this.calcPosCenter(jsP.option).top; | ||
197 | + } else { | ||
198 | + panelpos.top = this.calcPos('top', jsP); // change in 2.5.4 | ||
199 | + } | ||
200 | + } | ||
201 | + // calculate left | right values != center | ||
202 | + if (jsP.option.position.right || jsP.option.position.right === 0) { | ||
203 | + this.calcPos('right', jsP); | ||
204 | + } else if (jsP.option.position.left || jsP.option.position.left === 0) { | ||
205 | + if (jsP.option.position.left === 'center') { | ||
206 | + jsP.option.position.left = this.calcPosCenter(jsP.option).left; | ||
207 | + } else { | ||
208 | + panelpos.left = this.calcPos('left', jsP); // change in 2.5.4 | ||
209 | + } | ||
210 | + } | ||
211 | + if (jsP.option.position.top) { | ||
212 | + panelpos.top = parseInt(jsP.option.position.top, 10) + jsP.option.offset.top; | ||
213 | + } else { | ||
214 | + panelpos.bottom = parseInt(jsP.option.position.bottom, 10) + jsP.option.offset.top; | ||
215 | + } | ||
216 | + if (jsP.option.position.left) { | ||
217 | + panelpos.left = parseInt(jsP.option.position.left, 10) + jsP.option.offset.left; | ||
218 | + } else { | ||
219 | + panelpos.right = parseInt(jsP.option.position.right, 10) + jsP.option.offset.left; | ||
220 | + } | ||
221 | + jsP.css(panelpos); | ||
222 | + jsP.option.position = { | ||
223 | + top: jsP.css('top'), | ||
224 | + left: jsP.css('left') | ||
225 | + }; | ||
226 | + }, | ||
227 | + | ||
228 | + // used in calcPanelposition | ||
229 | + calcPos: function (prop, panel) { | ||
230 | + var optPosition = panel.option.position; | ||
231 | + if (optPosition[prop] === 'auto') { | ||
232 | + panel.option.position[prop] = panel.count * 30; | ||
233 | + } else if ($.isFunction(optPosition[prop])) { | ||
234 | + panel.option.position[prop] = optPosition[prop](panel); | ||
235 | + } else if (optPosition[prop] === 0) { | ||
236 | + panel.option.position[prop] = '0'; | ||
237 | + } else { | ||
238 | + panel.option.position[prop] = parseInt(optPosition[prop], 10); | ||
239 | + } | ||
240 | + // corrections if jsPanel is appended to the body element | ||
241 | + if (panel.option.selector === 'body') { | ||
242 | + if (prop === 'top') { | ||
243 | + panel.option.position.top = parseInt(optPosition.top, 10) + $(window).scrollTop(); | ||
244 | + } else if (prop === 'bottom') { | ||
245 | + panel.option.position.bottom = parseInt(optPosition.bottom, 10) - $(window).scrollTop(); | ||
246 | + } else if (prop === 'left') { | ||
247 | + panel.option.position.left = parseInt(optPosition.left, 10) + $(window).scrollLeft(); | ||
248 | + } else if (prop === 'right') { | ||
249 | + panel.option.position.right = parseInt(optPosition.right, 10) - $(window).scrollLeft(); | ||
250 | + } | ||
251 | + } | ||
252 | + return panel.option.position[prop]; | ||
253 | + }, | ||
254 | + | ||
255 | + // calculate position center for option.position == 'center' | ||
256 | + calcPosCenter: function (option) { | ||
257 | + var optSelector = option.selector, | ||
258 | + optSize = option.size, | ||
259 | + posL = ($(optSelector).outerWidth() / 2) - ((parseInt(optSize.width, 10) / 2)), | ||
260 | + posT; | ||
261 | + if (optSelector === 'body') { | ||
262 | + posT = ($(window).outerHeight() / 2) - ((parseInt(optSize.height, 10) / 2) - $(window).scrollTop()); | ||
263 | + } else { | ||
264 | + posT = ($(optSelector).outerHeight() / 2) - ((parseInt(optSize.height, 10) / 2)); | ||
265 | + } | ||
266 | + return { top: posT, left: posL }; | ||
267 | + }, | ||
268 | + | ||
269 | + // calculate position for maximized panels using option.controls.maxtoScreen (for devmondo) | ||
270 | + calcPosmaxtoScreen: function (panel) { | ||
271 | + var offset = panel.offset(); | ||
272 | + return { | ||
273 | + top: parseInt(panel.css('top')) - (offset.top - $(document).scrollTop()) + 5, | ||
274 | + left: parseInt(panel.css('left')) - (offset.left - $(document).scrollLeft()) + 5 | ||
275 | + }; | ||
276 | + }, | ||
277 | + | ||
278 | + // calculates css left for tooltips | ||
279 | + calcPosTooltipLeft: function (jsPparent, option) { | ||
280 | + // width of element serving as trigger for the tooltip | ||
281 | + var parW = jsPparent.outerWidth(), | ||
282 | + // check possible margins of trigger | ||
283 | + mL = parseInt(jsPparent.css('margin-left')), | ||
284 | + // check whether offset is set | ||
285 | + oX = option.offset.left || 0, | ||
286 | + optptPosition = option.paneltype.position; | ||
287 | + if (optptPosition === 'top' || optptPosition === 'bottom') { | ||
288 | + return (parW - option.size.width) / 2 + mL + oX; | ||
289 | + } else if (optptPosition === 'left') { | ||
290 | + return -(option.size.width) + mL + oX; | ||
291 | + } else if (optptPosition === 'right') { | ||
292 | + return parW + mL + oX; | ||
293 | + } | ||
294 | + return false; | ||
295 | + }, | ||
296 | + | ||
297 | + // calculates css top for tooltips | ||
298 | + calcPosTooltipTop: function (jsPparent, option) { | ||
299 | + var parH = jsPparent.innerHeight(), | ||
300 | + mT = parseInt(jsPparent.css('margin-top')), | ||
301 | + oY = option.offset.top || 0, | ||
302 | + optptPosition = option.paneltype.position; | ||
303 | + if (optptPosition === 'left' || optptPosition === 'right') { | ||
304 | + return -(option.size.height / 2) + (parH / 2) + mT + oY; | ||
305 | + } else if (optptPosition === 'top') { | ||
306 | + return -(option.size.height + oY) + mT; | ||
307 | + } else if (optptPosition === 'bottom') { | ||
308 | + return parH + mT + oY; | ||
309 | + } | ||
310 | + return false; | ||
311 | + }, | ||
312 | + | ||
313 | + // calculate final tooltip position | ||
314 | + calcToooltipPosition: function (jsPparent, option) { | ||
315 | + return { | ||
316 | + top: this.calcPosTooltipTop(jsPparent, option), | ||
317 | + left: this.calcPosTooltipLeft(jsPparent, option) | ||
318 | + }; | ||
319 | + }, | ||
320 | + | ||
321 | + calcVerticalOffset: function (panel) { | ||
322 | + return Math.floor(panel.offset().top - $(window).scrollTop()); | ||
323 | + }, | ||
324 | + | ||
325 | + // closes a jsPanel and removes it from the DOM | ||
326 | + close: function (panel) { | ||
327 | + // alert('jspanel closed') | ||
328 | + // get parent-element of jsPanel | ||
329 | + var context = panel.parent(), | ||
330 | + panelID = panel.attr('id'); | ||
331 | + panel.trigger('jspanelbeforeclose', panelID); | ||
332 | + if ($.isFunction(panel.option.onbeforeclose)) { | ||
333 | + var close = panel.option.onbeforeclose.call(panel, panel); | ||
334 | + if (close === false) { | ||
335 | + return panel; | ||
336 | + } | ||
337 | + } | ||
338 | + // delete childpanels ... | ||
339 | + this.closeChildpanels(panel); | ||
340 | + // if present remove tooltip wrapper | ||
341 | + if (context.hasClass('jsPanel-tooltip-wrapper')) { | ||
342 | + panel.unwrap(); | ||
343 | + } | ||
344 | + // remove the jsPanel itself | ||
345 | + panel.remove(); | ||
346 | + $('body').trigger('jspanelclosed', panelID); | ||
347 | + // remove backdrop only when modal jsPanel is closed | ||
348 | + if (panel.option.paneltype.type === 'modal') { | ||
349 | + $('.jsPanel-backdrop').remove(); | ||
350 | + } | ||
351 | + // reposition minimized panels | ||
352 | + this.reposMinimized(this.widthForMinimized); | ||
353 | + // reposition hints | ||
354 | + if (panel.option.paneltype.type === 'hint') { | ||
355 | + if (panel.hasClass("jsPanel-hint-tl")) { | ||
356 | + jsPanel.reposHints("jsPanel-hint-tl", panel.parentElmtTagname); | ||
357 | + } else if (panel.hasClass("jsPanel-hint-tc")) { | ||
358 | + jsPanel.reposHints("jsPanel-hint-tc", panel.parentElmtTagname); | ||
359 | + } else if (panel.hasClass("jsPanel-hint-tr")) { | ||
360 | + jsPanel.reposHints("jsPanel-hint-tr", panel.parentElmtTagname); | ||
361 | + } | ||
362 | + } | ||
363 | + if ($.isFunction(panel.option.onclosed)) { | ||
364 | + panel.option.onclosed.call(panel, panel); | ||
365 | + } | ||
366 | + return context; | ||
367 | + }, | ||
368 | + | ||
369 | + // close all tooltips | ||
370 | + closeallTooltips: function () { | ||
371 | + $('.jsPanel-tt').each(function () { | ||
372 | + // remove tooltip wrapper and than remove tooltip | ||
373 | + $(this).unwrap().remove(); | ||
374 | + $('body').trigger('jspanelclosed', $(this).attr('id')); | ||
375 | + }); | ||
376 | + }, | ||
377 | + | ||
378 | + // closes/removes all childpanels within the parent jsPanel | ||
379 | + closeChildpanels: function (panel) { | ||
380 | + $('.jsPanel', panel).each(function () { | ||
381 | + panel.trigger('jspanelbeforeclose', $(this).attr('id')); | ||
382 | + $(this).remove(); | ||
383 | + $('body').trigger('jspanelclosed', $(this).attr('id')); | ||
384 | + }); | ||
385 | + return panel; | ||
386 | + }, | ||
387 | + | ||
388 | + // configure controls | ||
389 | + configControls: function (panel) { | ||
390 | + var controls = ["close", "maximize", "minimize", "normalize", "smallify"]; | ||
391 | + if (panel.option.controls.buttons === 'closeonly') { | ||
392 | + $("div:not('.jsPanel-btn-close')", panel.header.controls).remove(); // change in 2.5.3 | ||
393 | + panel.header.title.css("width", "calc(100% - 30px)"); | ||
394 | + } else if (panel.option.controls.buttons === 'none') { | ||
395 | + $('*', panel.header.controls).remove(); | ||
396 | + panel.header.title.css("width", "100%"); | ||
397 | + } | ||
398 | + // disable controls individually | ||
399 | + controls.forEach(function (ctrl) { | ||
400 | + if (panel.option.controls[ctrl]) { panel.control('disable', ctrl); } | ||
401 | + }); | ||
402 | + }, | ||
403 | + | ||
404 | + // configure iconfonts | ||
405 | + configIconfont: function (panel) { | ||
406 | + var controlsArray = ["close", "max", "norm", "min", "small", "smallrev"], | ||
407 | + bootstrapArray = ["remove", "fullscreen", "resize-full", "minus", "chevron-up", "chevron-down"], | ||
408 | + fontawesomeArray = ["times", "arrows-alt", "expand", "minus", "chevron-up", "chevron-down"], | ||
409 | + optIconfont = panel.option.controls.iconfont, | ||
410 | + controls = panel.header.controls; | ||
411 | + // remove icon sprites | ||
412 | + $('*', controls).css('background-image', 'none'); | ||
413 | + // set icons | ||
414 | + if (optIconfont === 'bootstrap') { | ||
415 | + controlsArray.forEach(function (item, i) { | ||
416 | + $('.jsPanel-btn-' + item, controls).empty().append('<span class="glyphicon glyphicon-' + bootstrapArray[i] + '"></span>'); | ||
417 | + }); | ||
418 | + } else if (optIconfont === 'font-awesome') { | ||
419 | + controlsArray.forEach(function (item, i) { | ||
420 | + $('.jsPanel-btn-' + item, controls).empty().append('<span class="fa fa-' + fontawesomeArray[i] + '"></span>'); | ||
421 | + }); | ||
422 | + } | ||
423 | + }, | ||
424 | + | ||
425 | + // builds toolbar | ||
426 | + configToolbar: function (toolbaritems, toolbarplace, panel) { | ||
427 | + var el; | ||
428 | + toolbaritems.forEach(function (item) { | ||
429 | + if (typeof item === "object") { | ||
430 | + el = $(item.item); | ||
431 | + // add text to button | ||
432 | + if (typeof item.btntext === 'string') { | ||
433 | + el.append(item.btntext); | ||
434 | + } | ||
435 | + // add class to button | ||
436 | + if (typeof item.btnclass === 'string') { | ||
437 | + el.addClass(item.btnclass); | ||
438 | + } | ||
439 | + toolbarplace.append(el); | ||
440 | + // bind handler to the item | ||
441 | + if ($.isFunction(item.callback)) { | ||
442 | + el.on(item.event, panel, item.callback); | ||
443 | + // jsP is accessible in the handler as "event.data" | ||
444 | + } | ||
445 | + } | ||
446 | + }); | ||
447 | + }, | ||
448 | + | ||
449 | + // disable/enable individual controls | ||
450 | + control: function (panel, action, btn) { | ||
451 | + var controls = panel.header.controls, | ||
452 | + controlbtn; | ||
453 | + if (arguments.length === 3) { | ||
454 | + if (arguments[1] === 'disable') { | ||
455 | + if (btn === 'close') { | ||
456 | + controlbtn = $('.jsPanel-btn-close', controls); | ||
457 | + } else if (btn === 'maximize') { | ||
458 | + controlbtn = $('.jsPanel-btn-max', controls); | ||
459 | + } else if (btn === 'minimize') { | ||
460 | + controlbtn = $('.jsPanel-btn-min', controls); | ||
461 | + } else if (btn === 'normalize') { | ||
462 | + controlbtn = $('.jsPanel-btn-norm', controls); | ||
463 | + } else if (btn === 'smallify') { | ||
464 | + controlbtn = $('.jsPanel-btn-small', controls); | ||
465 | + } | ||
466 | + // unbind handler and set styles | ||
467 | + controlbtn.off().css({ opacity: 0.5, cursor: 'default' }); | ||
468 | + } else if (arguments[1] === 'enable') { | ||
469 | + if (btn === 'close') { | ||
470 | + controlbtn = $('.jsPanel-btn-close', controls); | ||
471 | + } else if (btn === 'maximize') { | ||
472 | + controlbtn = $('.jsPanel-btn-max', controls); | ||
473 | + } else if (btn === 'minimize') { | ||
474 | + controlbtn = $('.jsPanel-btn-min', controls); | ||
475 | + } else if (btn === 'normalize') { | ||
476 | + controlbtn = $('.jsPanel-btn-norm', controls); | ||
477 | + } else if (btn === 'smallify') { | ||
478 | + controlbtn = $('.jsPanel-btn-small', controls); | ||
479 | + } | ||
480 | + // enable control and reset styles | ||
481 | + controlbtn.on('click', function (e) { | ||
482 | + e.preventDefault(); | ||
483 | + panel[btn](); | ||
484 | + }).css({ opacity: 1, cursor: 'pointer' }); | ||
485 | + } | ||
486 | + } | ||
487 | + return panel; | ||
488 | + }, | ||
489 | + | ||
490 | + // helper function for the doubleclick handlers (title, content, footer) | ||
491 | + dblclickhelper: function (odcs, panel) { | ||
492 | + if (typeof odcs === 'string') { | ||
493 | + if (odcs === "maximize" || odcs === "normalize") { | ||
494 | + if (panel.status === "normalized" || panel.option.panelstatus === "normalized") { | ||
495 | + panel.maximize(); | ||
496 | + } else { | ||
497 | + panel.normalize(); | ||
498 | + } | ||
499 | + } else if (odcs === "minimize" || odcs === "smallify" || odcs === "close") { | ||
500 | + panel[odcs](); | ||
501 | + } | ||
502 | + } | ||
503 | + }, | ||
504 | + | ||
505 | + // export a panel layout to localStorage and returns array with an object for each panel | ||
506 | + exportPanels: function () { | ||
507 | + var elmtOffset, elmtPosition, elmtTop, elmtLeft, elmtWidth, elmtHeight, elmtStatus, panelParent, | ||
508 | + panelArr = [], exportedPanel, | ||
509 | + panels = $(".jsPanel").not(".jsPanel-tt, .jsPanel-hint, .jsPanel-modal"); | ||
510 | + panels.each(function (index, elmt) { | ||
511 | + exportedPanel = { | ||
512 | + panelstatus: $(elmt).data("panelstatus"), | ||
513 | + id: $(elmt).prop("id"), | ||
514 | + title: $(".jsPanel-title", elmt).html(), | ||
515 | + custom: $(elmt).data("custom"), | ||
516 | + offset: { top: 0, left: 0 }, | ||
517 | + content: $(elmt).data("content") | ||
518 | + }; | ||
519 | + // normalize minimized/maximized panels before export | ||
520 | + // status to restore is saved in exportedPanel.panelstatus | ||
521 | + if ($(elmt).data("panelstatus") !== "normalized") { | ||
522 | + $(".jsPanel-btn-norm", elmt).trigger("click"); | ||
523 | + } | ||
524 | + panelParent = $(elmt).data("selector"); | ||
525 | + elmtOffset = $(elmt).offset(); | ||
526 | + elmtPosition = $(elmt).position(); | ||
527 | + if (elmtStatus === "minimized") { | ||
528 | + if (panelParent.toLowerCase() === "body") { | ||
529 | + elmtTop = $(elmt).data("paneltop") - $(window).scrollTop() + "px"; | ||
530 | + elmtLeft = $(elmt).data("panelleft") - $(window).scrollLeft() + "px"; | ||
531 | + } else { | ||
532 | + elmtTop = $(elmt).data("paneltop") + "px"; | ||
533 | + elmtLeft = $(elmt).data("panelleft") + "px"; | ||
534 | + } | ||
535 | + elmtWidth = $(elmt).data("panelwidth") + "px"; | ||
536 | + elmtHeight = $(elmt).data("panelheight") + "px"; | ||
537 | + } else { | ||
538 | + if (panelParent.toLowerCase() === "body") { | ||
539 | + elmtTop = Math.floor(elmtOffset.top - $(window).scrollTop()) + "px"; | ||
540 | + elmtLeft = Math.floor(elmtOffset.left - $(window).scrollLeft()) + "px"; | ||
541 | + } else { | ||
542 | + elmtTop = Math.floor(elmtPosition.top) + "px"; | ||
543 | + elmtLeft = Math.floor(elmtPosition.left) + "px"; | ||
544 | + } | ||
545 | + elmtWidth = $(elmt).css("width"); | ||
546 | + elmtHeight = $(".jsPanel-content", elmt).css("height"); | ||
547 | + } | ||
548 | + exportedPanel.size = { | ||
549 | + width: elmtWidth, | ||
550 | + height: elmtHeight | ||
551 | + }; | ||
552 | + exportedPanel.position = { | ||
553 | + top: elmtTop, | ||
554 | + left: elmtLeft | ||
555 | + }; | ||
556 | + if ($(elmt).data("loadURL")) { | ||
557 | + exportedPanel.load = {}; | ||
558 | + exportedPanel.load.url = $(elmt).data("loadURL"); | ||
559 | + } | ||
560 | + if ($(elmt).data("ajaxURL")) { | ||
561 | + exportedPanel.ajax = {}; | ||
562 | + exportedPanel.ajax.url = $(elmt).data("ajaxURL"); | ||
563 | + } | ||
564 | + if ($(elmt).data("iframeDOC") || $(elmt).data("iframeSRC")) { | ||
565 | + exportedPanel.iframe = {}; | ||
566 | + if ($(elmt).data("iframeDOC")) { | ||
567 | + exportedPanel.iframe.srcdoc = $(elmt).data("iframeDOC"); | ||
568 | + } | ||
569 | + if ($(elmt).data("iframeSRC")) { | ||
570 | + exportedPanel.iframe.src = $(elmt).data("iframeSRC"); | ||
571 | + } | ||
572 | + } | ||
573 | + panelArr.push(exportedPanel); | ||
574 | + // restore status that is saved | ||
575 | + switch (exportedPanel.panelstatus) { | ||
576 | + case "minimized": | ||
577 | + $(".jsPanel-btn-min", elmt).trigger("click"); | ||
578 | + break; | ||
579 | + case "maximized": | ||
580 | + $(".jsPanel-btn-max", elmt).trigger("click"); | ||
581 | + break; | ||
582 | + case "smallified": | ||
583 | + $(".jsPanel-btn-small", elmt).trigger("click"); | ||
584 | + break; | ||
585 | + case "smallifiedMax": | ||
586 | + $(".jsPanel-btn-small", elmt).trigger("click"); | ||
587 | + break; | ||
588 | + } | ||
589 | + }); | ||
590 | + //window.localStorage.setItem("jspanels", panelArr); | ||
591 | + window.localStorage.setItem("jspanels", JSON.stringify(panelArr)); | ||
592 | + return panelArr; | ||
593 | + }, | ||
594 | + | ||
595 | + // imports panel layout from localStorage.jspanels and restores panels | ||
596 | + importPanels: function (predefinedConfigs) { | ||
597 | + /* panelConfig needs to be an object with predefined configs. | ||
598 | + * A config named "default" will be applied to ALL panels | ||
599 | + * | ||
600 | + * panelConfig = { default: { } [, config1 [, config2 [, configN ]]] }; | ||
601 | + */ | ||
602 | + var savedPanels, restoredConfig, defaultConfig; | ||
603 | + savedPanels = JSON.parse(localStorage.jspanels) || {}; | ||
604 | + defaultConfig = predefinedConfigs["default"] || {}; | ||
605 | + savedPanels.forEach(function (savedconfig) { | ||
606 | + // safedconfig represents one item in safedPanels | ||
607 | + if (typeof savedconfig.custom.config === "string") { | ||
608 | + restoredConfig = $.extend(true, {}, defaultConfig, predefinedConfigs[savedconfig.custom.config], savedconfig); | ||
609 | + } else { | ||
610 | + restoredConfig = $.extend(true, {}, defaultConfig, savedconfig); | ||
611 | + } | ||
612 | + // restore panel | ||
613 | + $.jsPanel(restoredConfig); | ||
614 | + }); | ||
615 | + }, | ||
616 | + | ||
617 | + // maintains panel position relative to window on scroll of page | ||
618 | + fixPosition: function (panel) { | ||
619 | + var jspaneldiff = panel.offset().top - $(window).scrollTop(); | ||
620 | + panel.jsPanelfixPos = function () { | ||
621 | + panel.css('top', $(window).scrollTop() + jspaneldiff); | ||
622 | + }; | ||
623 | + $(window).on('scroll', panel.jsPanelfixPos); | ||
624 | + }, | ||
625 | + | ||
626 | + // calculate panel margins | ||
627 | + getMargins: function (panel) { | ||
628 | + var off, elmtOff, mR, mL, mB, mT, | ||
629 | + selector = panel.option.paneltype.shiftwithin, | ||
630 | + winWidth = $(window).outerWidth(), | ||
631 | + winHeight = $(window).outerHeight(), | ||
632 | + panelWidth = panel.outerWidth(), | ||
633 | + panelHeight = panel.outerHeight(); | ||
634 | + if (!selector || selector === "body") { | ||
635 | + // panel margins relative to browser viewport | ||
636 | + off = panel.offset(); | ||
637 | + mR = winWidth - off.left - panelWidth + $(window).scrollLeft(); | ||
638 | + mL = winWidth - panelWidth - mR; | ||
639 | + mB = winHeight - off.top - panelHeight + $(window).scrollTop(); | ||
640 | + mT = winHeight - panelHeight - mB; | ||
641 | + } else { | ||
642 | + // panel margins relative to element matching selector "selector" | ||
643 | + elmtOff = $(selector).offset(); | ||
644 | + off = panel.offset(); | ||
645 | + mR = $(selector).outerWidth() - parseInt(panel.css('width')) - (off.left - elmtOff.left); | ||
646 | + mL = off.left - elmtOff.left; | ||
647 | + mB = $(selector).outerHeight() - (off.top - elmtOff.top) - parseInt(panel.css('height')); | ||
648 | + mT = off.top - elmtOff.top; | ||
649 | + } | ||
650 | + return { marginTop: parseInt(mT), marginRight: parseInt(mR), marginBottom: parseInt(mB), marginLeft: parseInt(mL) }; | ||
651 | + }, | ||
652 | + | ||
653 | + // return max value of an array with numbers | ||
654 | + getMaxOfArray: function (numArray) { | ||
655 | + return Math.max.apply(null, numArray); | ||
656 | + }, | ||
657 | + | ||
658 | + // calculate max horizontal and vertical tooltip shift | ||
659 | + getMaxpanelshift: function (panel) { | ||
660 | + var panelWidth = panel.outerWidth(), | ||
661 | + panelHeight = panel.outerHeight(), | ||
662 | + horiz = parseInt(panelWidth / 2) + parseInt(panel.parent().outerWidth() / 2) - 20, | ||
663 | + vert = parseInt(panelHeight / 2) + parseInt(panel.parent().outerHeight() / 2) - 20, | ||
664 | + cornerHoriz = parseInt(panelWidth / 2) - 16, | ||
665 | + cornerVert = parseInt(panelHeight / 2) - 16; | ||
666 | + return { maxshiftH: horiz, maxshiftV: vert, maxCornerH: cornerHoriz, maxCornerV: cornerVert }; | ||
667 | + }, | ||
668 | + | ||
669 | + // hide controls specified by param "sel" of the jsPanel "panel" | ||
670 | + hideControls: function (sel, panel) { | ||
671 | + var controls = panel.header.controls; | ||
672 | + $("*", controls).css('display', 'block'); | ||
673 | + $('#minSpan').css({ 'display': '' }); | ||
674 | + | ||
675 | + $(sel, controls).css('display', 'none'); | ||
676 | + }, | ||
677 | + | ||
678 | + // calculates option.position for hints using 'top left', 'top center' or 'top right' | ||
679 | + hintTop: function (hintGroup) { | ||
680 | + var hintH = 0; | ||
681 | + $("." + hintGroup).each(function () { | ||
682 | + hintH += $(this).outerHeight(true); | ||
683 | + }); | ||
684 | + if (hintGroup === "jsPanel-hint-tr") { | ||
685 | + return { top: hintH, right: 0 }; | ||
686 | + } else if (hintGroup === "jsPanel-hint-tl") { | ||
687 | + return { top: hintH, left: 0 }; | ||
688 | + } else if (hintGroup === "jsPanel-hint-tc") { | ||
689 | + return { top: hintH, left: 'center' }; | ||
690 | + } | ||
691 | + return { top: 0, left: 0 }; | ||
692 | + }, | ||
693 | + | ||
694 | + // loads content in an iFrame | ||
695 | + iframe: function (panel) { | ||
696 | + var iFrame = $("<iframe></iframe>"); | ||
697 | + // iframe content | ||
698 | + if (panel.option.iframe.srcdoc) { | ||
699 | + iFrame.prop("srcdoc", panel.option.iframe.srcdoc); | ||
700 | + panel.data("iframeDOC", panel.option.iframe.srcdoc); // needed for exportPanels() | ||
701 | + } | ||
702 | + if (panel.option.iframe.src) { | ||
703 | + iFrame.prop("src", panel.option.iframe.src); | ||
704 | + panel.data("iframeSRC", panel.option.iframe.src); // needed for exportPanels() | ||
705 | + } | ||
706 | + //iframe size | ||
707 | + if (panel.option.size.width !== "auto" && !panel.option.iframe.width) { | ||
708 | + iFrame.prop("width", "100%"); | ||
709 | + } else if (typeof panel.option.iframe.width === 'string' && panel.option.iframe.width.slice(-1) === '%') { | ||
710 | + iFrame.prop("width", panel.option.iframe.width); | ||
711 | + } else { | ||
712 | + iFrame.prop("width", parseInt(panel.option.iframe.width) + 'px'); | ||
713 | + } | ||
714 | + if (panel.option.size.height !== "auto" && !panel.option.iframe.height) { | ||
715 | + iFrame.prop("height", "100%"); | ||
716 | + } else if (typeof panel.option.iframe.height === 'string' && panel.option.iframe.height.slice(-1) === '%') { | ||
717 | + iFrame.prop("height", panel.option.iframe.height); | ||
718 | + } else { | ||
719 | + iFrame.prop("height", parseInt(panel.option.iframe.height) + 'px'); | ||
720 | + } | ||
721 | + //iframe name | ||
722 | + if (typeof panel.option.iframe.name === 'string') { | ||
723 | + iFrame.prop("name", panel.option.iframe.name); | ||
724 | + } | ||
725 | + //iframe id | ||
726 | + if (typeof panel.option.iframe.id === 'string') { | ||
727 | + iFrame.prop("id", panel.option.iframe.id); | ||
728 | + } | ||
729 | + //iframe seamless (not yet supported by any browser) | ||
730 | + if (panel.option.iframe.seamless) { | ||
731 | + iFrame.prop("seamless", "seamless"); | ||
732 | + } | ||
733 | + //iframe sandbox | ||
734 | + if (typeof panel.option.iframe.sandbox === 'string') { | ||
735 | + iFrame.prop("sandox", panel.option.iframe.sandbox); | ||
736 | + } | ||
737 | + //iframe style | ||
738 | + if ($.isPlainObject(panel.option.iframe.style)) { | ||
739 | + iFrame.css(panel.option.iframe.style); | ||
740 | + } | ||
741 | + //iframe css classes | ||
742 | + if (typeof panel.option.iframe.classname === 'string') { | ||
743 | + iFrame.addClass(panel.option.iframe.classname); | ||
744 | + } else if ($.isFunction(panel.option.iframe.classname)) { | ||
745 | + iFrame.addClass(panel.option.iframe.classname()); | ||
746 | + } | ||
747 | + panel.content.empty().append(iFrame); | ||
748 | + }, | ||
749 | + | ||
750 | + // append modal backdrop | ||
751 | + insertModalBackdrop: function () { | ||
752 | + var backdrop = '<div class="jsPanel-backdrop" style="height:' + $(document).outerHeight() + 'px;"></div>'; | ||
753 | + $('body').append(backdrop); | ||
754 | + /*$(document).on("keydown", ".jsPanel-backdrop", function(e){ | ||
755 | + e.preventDefault(); | ||
756 | + return false; | ||
757 | + });*/ | ||
758 | + }, | ||
759 | + | ||
760 | + // check whether a bootstrap compatible theme is used | ||
761 | + isBootstrapTheme: function (optionBootstrap) { | ||
762 | + if ($.inArray(optionBootstrap, ["default", "primary", "info", "success", "warning", "danger"]) > -1) { | ||
763 | + return optionBootstrap; | ||
764 | + } | ||
765 | + return "default"; | ||
766 | + }, | ||
767 | + | ||
768 | + // loads content using jQuery.load() | ||
769 | + load: function (panel) { | ||
770 | + // alert('pppp') | ||
771 | + panel.content.load(panel.option.load.url, panel.option.load.data || undefined, function (responseText, textStatus, jqXHR) { | ||
772 | + if ($.isFunction(panel.option.load.complete)) { | ||
773 | + panel.option.load.complete.call(panel.content, responseText, textStatus, jqXHR, panel); | ||
774 | + } | ||
775 | + // title h3 might be to small: load() is async! | ||
776 | + jsPanel.resizeTitle(panel); | ||
777 | + // update option.size (content might come delayed) | ||
778 | + jsPanel.updateOptionSize(panel, panel.option.size); | ||
779 | + // fix for a bug in jQuery-UI draggable? that causes the jsPanel to reduce width when dragged beyond boundary of containing element and option.size.width is 'auto' | ||
780 | + panel.content.css('width', function () { | ||
781 | + return panel.content.outerWidth(); | ||
782 | + }); | ||
783 | + }); | ||
784 | + panel.data("loadURL", panel.option.load.url); // needed for exportPanels() | ||
785 | + | ||
786 | + | ||
787 | + | ||
788 | + }, | ||
789 | + | ||
790 | + // maximizes a panel within the body element | ||
791 | + maxWithinBody: function (panel) { | ||
792 | + var newPos, newTop, newLeft, newRight; | ||
793 | + if ((panel.status !== "maximized" || panel.option.panelstatus !== "maximized") && panel.option.paneltype.mode !== 'default') { | ||
794 | + // remove window.scroll handler, is added again later in this function | ||
795 | + $(window).off('scroll', panel.jsPanelfixPos); | ||
796 | + // restore minimized panel to initial container if necessary | ||
797 | + if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
798 | + this.restoreFromMinimized(panel); | ||
799 | + } | ||
800 | + // test to enable fullscreen maximize for panels in a parent other than body | ||
801 | + if (panel.option.controls.maxtoScreen === true) { | ||
802 | + newPos = this.calcPosmaxtoScreen(panel); | ||
803 | + newTop = newPos.top + parseInt(panel.option.maximizedMargin.top); | ||
804 | + newLeft = newPos.left + parseInt(panel.option.maximizedMargin.left); | ||
805 | + } else { | ||
806 | + //nikita | ||
807 | + //newTop = $(window).scrollTop() + parseInt(panel.option.maximizedMargin.top); | ||
808 | + //newLeft = $(window).scrollLeft() + parseInt(panel.option.maximizedMargin.left); | ||
809 | + newTop = 70; | ||
810 | + newLeft = 0; | ||
811 | + //nikita | ||
812 | + newRight = 15; | ||
813 | + } | ||
814 | + panel.css({ | ||
815 | + top: newTop, | ||
816 | + left: newLeft, | ||
817 | + //nikita | ||
818 | + right: newRight, | ||
819 | + width: $(window).outerWidth() - 10, height: $(window).outerHeight() - 90 | ||
820 | + | ||
821 | + //width: $(window).outerWidth() - parseInt(panel.option.maximizedMargin.left) - parseInt(panel.option.maximizedMargin.right), | ||
822 | + //height: $(window).outerHeight() - parseInt(panel.option.maximizedMargin.top) - parseInt(panel.option.maximizedMargin.bottom) | ||
823 | + }); | ||
824 | + if ($('.tools') != null) { | ||
825 | + //nikita | ||
826 | + if ($('#canvasDiv') != null) { | ||
827 | + if (panel.outerHeight() >= 435 && panel.outerWidth() >= 650) { | ||
828 | + // alert('if') | ||
829 | + $('#canvasDiv').css('height', panel.outerHeight() - 75) | ||
830 | + $('#canvasDiv').css('width', panel.outerWidth() - 100) | ||
831 | + $('#canvasDiv').css('overflow', 'scroll') | ||
832 | + } | ||
833 | + else { | ||
834 | + // alert('else') | ||
835 | + $('#canvasDiv').css('height', panel.outerHeight() - 110) | ||
836 | + $('#canvasDiv').css('width', panel.outerWidth() - 90) | ||
837 | + $('#canvasDiv').css('overflow', 'scroll') | ||
838 | + } | ||
839 | + } | ||
840 | + } | ||
841 | + //nikita | ||
842 | + if (!panel.option.controls.maxtoScreen || (panel.option.controls.maxtoScreen && panel.option.selector === 'body')) { | ||
843 | + // test to enable fullscreen maximize for panels in a parent other than body | ||
844 | + this.fixPosition(panel); | ||
845 | + } | ||
846 | + } | ||
847 | + }, | ||
848 | + | ||
849 | + // maximizes a panel within an element other than body | ||
850 | + maxWithinElement: function (panel) { | ||
851 | + // debugger; | ||
852 | + if ((panel.status !== "maximized" || panel.option.panelstatus !== "maximized") && panel.option.paneltype.mode !== 'default') { | ||
853 | + // restore minimized panel to initial container if necessary | ||
854 | + if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
855 | + this.restoreFromMinimized(panel); | ||
856 | + } | ||
857 | + panel.css({ | ||
858 | + top: parseInt(70),//panel.option.maximizedMargin.top), | ||
859 | + left: parseInt(panel.option.maximizedMargin.left), | ||
860 | + width: parseInt(panel.parent().outerWidth(), 10) - parseInt(panel.option.maximizedMargin.left) - parseInt(panel.option.maximizedMargin.right), | ||
861 | + height: parseInt(panel.parent().outerHeight()) - parseInt(panel.option.maximizedMargin.top) - parseInt(panel.option.maximizedMargin.bottom) - 65 | ||
862 | + }); | ||
863 | + } | ||
864 | + if ($('.tools').length> 0) { | ||
865 | + //nikita | ||
866 | + if ($('#canvasDiv') != null) { | ||
867 | + if (panel.outerHeight() >= 435 && panel.outerWidth() >= 650) { | ||
868 | + //alert('if') | ||
869 | + // debugger; | ||
870 | + $('#canvasDiv').css('height', panel.outerHeight() - 85) | ||
871 | + $('#canvasDiv').css('width', panel.outerWidth() - 90) | ||
872 | + $('#canvasDiv').css('overflow', 'scroll') | ||
873 | + } | ||
874 | + else { | ||
875 | + // alert('else') | ||
876 | + $('#canvasDiv').css('height', panel.outerHeight() - 105) | ||
877 | + $('#canvasDiv').css('width', panel.outerWidth() - 80) | ||
878 | + $('#canvasDiv').css('overflow', 'scroll') | ||
879 | + | ||
880 | + } | ||
881 | + } | ||
882 | + } | ||
883 | + //nikita | ||
884 | + // debugger; | ||
885 | + // $(".fa-minus").removeClass('display'); | ||
886 | + $('#minSpan').css({ 'display': '' }); | ||
887 | + }, | ||
888 | + | ||
889 | + // calls functions to maximize a jsPanel | ||
890 | + maximize: function (panel) { | ||
891 | + // debugger; | ||
892 | + panel.trigger('jspanelbeforemaximize', panel.attr('id')); | ||
893 | + if ($.isFunction(panel.option.onbeforemaximize)) { | ||
894 | + var maximize = panel.option.onbeforemaximize.call(panel, panel); | ||
895 | + if (maximize === false) { | ||
896 | + return panel; | ||
897 | + } | ||
898 | + } | ||
899 | + if (panel.parentElmtTagname === 'body' || panel.option.controls.maxtoScreen === true) { | ||
900 | + this.maxWithinBody(panel); | ||
901 | + } else { | ||
902 | + this.maxWithinElement(panel); | ||
903 | + } | ||
904 | + panel.trigger('jspanelmaximized', panel.attr('id')); | ||
905 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
906 | + if ($.isFunction(panel.option.onmaximized)) { | ||
907 | + panel.option.onmaximized.call(panel, panel); | ||
908 | + } | ||
909 | + return panel; | ||
910 | + }, | ||
911 | + | ||
912 | + // minimizes a jsPanel to the lower left corner of the browser viewport | ||
913 | + minimize: function (panel) { | ||
914 | + panel.trigger('jspanelbeforeminimize', panel.attr('id')); | ||
915 | + if ($.isFunction(panel.option.onbeforeminimize)) { | ||
916 | + var minimize = panel.option.onbeforeminimize.call(panel, panel); | ||
917 | + if (minimize === false) { | ||
918 | + return panel; | ||
919 | + } | ||
920 | + } | ||
921 | + panel.data({ // needed for method exportPanels() | ||
922 | + "paneltop": parseInt(panel.option.position.top), | ||
923 | + "panelleft": parseInt(panel.option.position.left), | ||
924 | + "panelwidth": parseInt(panel.option.size.width), | ||
925 | + "panelheight": parseInt($(".jsPanel-content", panel).css("height")) | ||
926 | + }); | ||
927 | + // update panel size to have correct values when normalizing again | ||
928 | + if (panel.status === "normalized" || panel.option.panelstatus === "normalized") { | ||
929 | + panel.option.size.width = panel.outerWidth(); | ||
930 | + panel.option.size.height = panel.outerHeight(); | ||
931 | + } | ||
932 | + panel.animate({ | ||
933 | + opacity: 0 | ||
934 | + }, { | ||
935 | + duration: 400, // fade out speed when minimizing | ||
936 | + complete: function () { | ||
937 | + panel.animate({ | ||
938 | + width: jsPanel.widthForMinimized + "px", | ||
939 | + height: '28px' | ||
940 | + }, { | ||
941 | + duration: 100, | ||
942 | + complete: function () { | ||
943 | + jsPanel.movetoMinified(panel); | ||
944 | + jsPanel.resizeTitle(panel); | ||
945 | + panel.css('opacity', 1); | ||
946 | + } | ||
947 | + }); | ||
948 | + } | ||
949 | + }); | ||
950 | + if ($.isFunction(panel.option.onminimized)) { | ||
951 | + panel.option.onminimized.call(panel, panel); | ||
952 | + } | ||
953 | + return panel; | ||
954 | + }, | ||
955 | + | ||
956 | + // moves a panel to the minimized container | ||
957 | + movetoMinified: function (panel) { | ||
958 | + // wenn der Container für die minimierten jsPanels noch nicht existiert -> erstellen | ||
959 | + if ($('#jsPanel-min-container').length === 0) { | ||
960 | + $('body').append('<div id="jsPanel-min-container"></div>'); | ||
961 | + } | ||
962 | + if (panel.status !== "minimized" || panel.option.panelstatus !== "minimized") { | ||
963 | + // jsPanel in vorgesehenen Container verschieben | ||
964 | + panel.css({ | ||
965 | + left: ($('.jsPanel', '#jsPanel-min-container').length * jsPanel.widthForMinimized), | ||
966 | + top: 0, | ||
967 | + opacity: 1 | ||
968 | + }) | ||
969 | + .appendTo('#jsPanel-min-container') | ||
970 | + .resizable({ disabled: true }) | ||
971 | + .draggable({ disabled: true }); | ||
972 | + panel.trigger('jspanelminimized', panel.attr('id')); | ||
973 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
974 | + } | ||
975 | + }, | ||
976 | + | ||
977 | + // restores a panel to its "normalized" (not minimized, maximized or smallified) position & size | ||
978 | + normalize: function (panel) { | ||
979 | + // debugger; | ||
980 | + var panelTop, | ||
981 | + interactions = ["resizable", "draggable"]; | ||
982 | + panel.trigger('jspanelbeforenormalize', panel.attr('id')); | ||
983 | + if ($.isFunction(panel.option.onbeforenormalize)) { | ||
984 | + var normalize = panel.option.onbeforenormalize.call(panel, panel); | ||
985 | + if (normalize === false) { | ||
986 | + return panel; | ||
987 | + } | ||
988 | + } | ||
989 | + // remove window.scroll handler, is added again later in this function | ||
990 | + $(window).off('scroll', panel.jsPanelfixPos); | ||
991 | + // restore minimized panel to initial container if necessary | ||
992 | + if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
993 | + this.restoreFromMinimized(panel); | ||
994 | + } | ||
995 | + // correction for panels maximized in body after page was scrolled | ||
996 | + if (panel.parentElmtTagname === 'body') { | ||
997 | + panelTop = $(window).scrollTop() + panel.verticalOffset; | ||
998 | + } else { | ||
999 | + panelTop = panel.option.position.top; | ||
1000 | + } | ||
1001 | + panel.css({ | ||
1002 | + width: panel.option.size.width, | ||
1003 | + height: panel.option.size.height + 10, | ||
1004 | + top: panelTop, | ||
1005 | + left: panel.option.position.left | ||
1006 | + }); | ||
1007 | + interactions.forEach(function (action) { | ||
1008 | + if (panel.option[action] !== "disabled") { | ||
1009 | + panel[action]("enable"); | ||
1010 | + // get resizer and cursor for resizable back | ||
1011 | + $('.ui-icon-gripsmall-diagonal-se', panel).css({ 'background-image': 'none', 'text-indent': 0 }); | ||
1012 | + $('.ui-resizable-handle', panel).css({ 'cursor': '' }); | ||
1013 | + } | ||
1014 | + }); | ||
1015 | + panel.trigger('jspanelnormalized', panel.attr('id')); | ||
1016 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1017 | + if (panel.parentElmtTagname === 'body') { | ||
1018 | + this.fixPosition(panel); | ||
1019 | + } | ||
1020 | + if ($.isFunction(panel.option.onnormalized)) { | ||
1021 | + panel.option.onnormalized.call(panel, panel); | ||
1022 | + } | ||
1023 | + return panel; | ||
1024 | + }, | ||
1025 | + | ||
1026 | + // replace bottom/right values with corresponding top/left values if necessary and update option.position | ||
1027 | + replaceCSSBottomRight: function (panel) { | ||
1028 | + var panelPosition = panel.position(); | ||
1029 | + if (panel.css('bottom')) { | ||
1030 | + panel.css({ | ||
1031 | + 'top': parseInt(panelPosition.top, 10), | ||
1032 | + 'bottom': '' | ||
1033 | + }); | ||
1034 | + panel.option.position.top = parseInt(panelPosition.top, 10); | ||
1035 | + } | ||
1036 | + if (panel.css('right')) { | ||
1037 | + panel.css({ | ||
1038 | + 'left': parseInt(panelPosition.left, 10), | ||
1039 | + 'right': '' | ||
1040 | + }); | ||
1041 | + panel.option.position.left = parseInt(panelPosition.left, 10); | ||
1042 | + } | ||
1043 | + }, | ||
1044 | + | ||
1045 | + // reposition hint upon closing | ||
1046 | + reposHints: function (hintGroup, jsPtagname) { | ||
1047 | + var hintH; | ||
1048 | + if (jsPtagname === 'body') { | ||
1049 | + hintH = $(window).scrollTop(); | ||
1050 | + } else { | ||
1051 | + hintH = 0; | ||
1052 | + } | ||
1053 | + $("." + hintGroup).each(function () { | ||
1054 | + $(this).animate({ | ||
1055 | + top: hintH | ||
1056 | + }); | ||
1057 | + hintH += $(this).outerHeight(true); | ||
1058 | + }); | ||
1059 | + }, | ||
1060 | + | ||
1061 | + // reposition hints on window scroll | ||
1062 | + reposHintsScroll: function (panel) { | ||
1063 | + var dif = panel.offset().top - $(window).scrollTop(); | ||
1064 | + // with window.onscroll only the last added hint would stay in position | ||
1065 | + $(window).scroll(function () { | ||
1066 | + panel.css('top', $(window).scrollTop() + dif); | ||
1067 | + }); | ||
1068 | + }, | ||
1069 | + | ||
1070 | + // repositions a panel and optionally moves it to another container | ||
1071 | + reposition: function (panel, position, selector) { | ||
1072 | + //alert('reposition') | ||
1073 | + if (selector && typeof selector === "string") { | ||
1074 | + panel.option.selector = selector; | ||
1075 | + panel.appendTo(selector); | ||
1076 | + panel.parentElmt = $(selector).first(); | ||
1077 | + panel.parentElmtTagname = panel.parentElmt[0].tagName.toLowerCase(); | ||
1078 | + } | ||
1079 | + if (panel.option.paneltype.type !== 'tooltip' && panel.option.paneltype.type !== 'hint') { | ||
1080 | + // rewrite passed position to be a proper object | ||
1081 | + panel.option.position = jsPanel.rewriteOPosition(position); | ||
1082 | + // delete element styles concerning position, otherwise you might end up with left &right and/or top & bottom values | ||
1083 | + panel.css({ top: "", right: "", bottom: "", left: "" }); | ||
1084 | + this.calcPanelposition(panel); | ||
1085 | + panel.verticalOffset = jsPanel.calcVerticalOffset(panel) || 0; | ||
1086 | + this.replaceCSSBottomRight(panel); | ||
1087 | + if (panel.parentElmtTagname === "body") { | ||
1088 | + this.fixPosition(panel); | ||
1089 | + } else { | ||
1090 | + $(window).off('scroll', panel.jsPanelfixPos); | ||
1091 | + } | ||
1092 | + this.updateOptionPosition(panel); | ||
1093 | + } | ||
1094 | + return panel; | ||
1095 | + }, | ||
1096 | + | ||
1097 | + // repositions minimized jsPanels | ||
1098 | + reposMinimized: function () { | ||
1099 | + $('.jsPanel', '#jsPanel-min-container').each(function (index, elmt) { | ||
1100 | + $(elmt).animate({ | ||
1101 | + left: (index * jsPanel.widthForMinimized) | ||
1102 | + }); | ||
1103 | + }); | ||
1104 | + }, | ||
1105 | + | ||
1106 | + // resize exsisting jsPanel; resizes the full panel (not content section only) | ||
1107 | + resize: function (panel, width, height) { | ||
1108 | + // debugger; | ||
1109 | + if (panel.option.panelstatus !== "minimized") { // v2.4.1 don't call resize() on minimized panels | ||
1110 | + if (width && width !== null) { | ||
1111 | + panel.css("width", width); | ||
1112 | + } else { | ||
1113 | + panel.css("width", panel.content.css("width")); | ||
1114 | + } | ||
1115 | + if (height && height !== null) { | ||
1116 | + panel.css("height", height); | ||
1117 | + } | ||
1118 | + this.resizeContent(panel); | ||
1119 | + this.resizeTitle(panel); | ||
1120 | + } | ||
1121 | + | ||
1122 | + if ($('#canvasDiv') != null) { | ||
1123 | + $('#canvasDiv').css('height', $(window).outerHeight() - 120) | ||
1124 | + $('#leftToolBar').css('height', $(window).outerHeight() - 120) | ||
1125 | + | ||
1126 | + } | ||
1127 | + }, | ||
1128 | + | ||
1129 | + // reset dimensions of content section after resize and so on | ||
1130 | + resizeContent: function (panel) { | ||
1131 | + var hdrftr; | ||
1132 | + if (panel.footer.css('display') === 'none') { | ||
1133 | + hdrftr = panel.header.outerHeight(); | ||
1134 | + } else { | ||
1135 | + hdrftr = panel.header.outerHeight() + panel.footer.outerHeight(); | ||
1136 | + } | ||
1137 | + panel.content.css({ | ||
1138 | + height: (panel.outerHeight() - hdrftr), | ||
1139 | + //nikita | ||
1140 | + width: panel.outerWidth() | ||
1141 | + }); | ||
1142 | + return panel; | ||
1143 | + }, | ||
1144 | + | ||
1145 | + // resize the title h3 to use full width minus controls width (and prevent being longer than panel) | ||
1146 | + resizeTitle: function (panel) { | ||
1147 | + var titleWidth = (panel.outerWidth() - $(panel.header.controls).outerWidth() - 15); | ||
1148 | + panel.header.title.css('width', titleWidth); | ||
1149 | + }, | ||
1150 | + | ||
1151 | + // restores minimized panels to their initial container, reenables resizable and draggable, repositions minimized panels | ||
1152 | + restoreFromMinimized: function (panel) { | ||
1153 | + var interactions = ["resizable", "draggable"]; | ||
1154 | + // restore minimized panel to initial container | ||
1155 | + if (panel.status === "minimized" || panel.option.panelstatus === "minimized") { | ||
1156 | + panel.appendTo(panel.option.selector); | ||
1157 | + } | ||
1158 | + interactions.forEach(function (action) { | ||
1159 | + if (panel.option[action] !== "disabled") { | ||
1160 | + panel[action]("enable"); | ||
1161 | + // get resizer and cursor for resizable back | ||
1162 | + $('.ui-icon-gripsmall-diagonal-se', panel).css({ 'background-image': 'none', 'text-indent': 0 }); | ||
1163 | + $('.ui-resizable-handle', panel).css({ 'cursor': '' }); | ||
1164 | + } | ||
1165 | + }); | ||
1166 | + // reposition minimized panels | ||
1167 | + this.reposMinimized(jsPanel.widthForMinimized); | ||
1168 | + }, | ||
1169 | + | ||
1170 | + // rewrite option.paneltype strings to objects and set defaults for option.paneltype | ||
1171 | + rewriteOPaneltype: function (optionPaneltype) { | ||
1172 | + var op = optionPaneltype; | ||
1173 | + if (op === 'modal') { | ||
1174 | + return { type: 'modal', mode: 'default' }; | ||
1175 | + } else if (op === 'tooltip') { | ||
1176 | + return { type: 'tooltip', position: 'top' }; | ||
1177 | + } else if (op === 'hint') { | ||
1178 | + return { type: 'hint' }; | ||
1179 | + } else if (op.type === 'modal') { | ||
1180 | + return { type: 'modal', mode: op.mode || 'default' }; | ||
1181 | + } else if (op.type === 'tooltip') { | ||
1182 | + return { | ||
1183 | + type: 'tooltip', | ||
1184 | + mode: op.mode || false, | ||
1185 | + position: op.position || false, | ||
1186 | + shiftwithin: op.shiftwithin || "body", | ||
1187 | + solo: op.solo || false, | ||
1188 | + cornerBG: op.cornerBG || false, | ||
1189 | + cornerOX: op.cornerOX || false, | ||
1190 | + cornerOY: op.cornerOY || false | ||
1191 | + }; | ||
1192 | + } else { | ||
1193 | + return { paneltype: false }; | ||
1194 | + } | ||
1195 | + }, | ||
1196 | + | ||
1197 | + // converts option.position string to object | ||
1198 | + rewriteOPosition: function (optionPosition) { | ||
1199 | + var op = optionPosition; | ||
1200 | + if (op === 'center') { | ||
1201 | + return { top: 'center', left: 'center' }; | ||
1202 | + } else if (op === 'auto') { | ||
1203 | + return { top: 'auto', left: 'auto' }; | ||
1204 | + } else if (op === 'top left') { | ||
1205 | + return { top: '0', left: '0' }; | ||
1206 | + } else if (op === 'top center') { | ||
1207 | + return { top: '0', left: 'center' }; | ||
1208 | + } else if (op === 'top right') { | ||
1209 | + return { top: '0', right: '0' }; | ||
1210 | + } else if (op === 'center right') { | ||
1211 | + return { top: 'center', right: '0' }; | ||
1212 | + } else if (op === 'bottom right') { | ||
1213 | + return { bottom: '0', right: '0' }; | ||
1214 | + } else if (op === 'bottom center') { | ||
1215 | + return { bottom: '0', left: 'center' }; | ||
1216 | + } else if (op === 'bottom left') { | ||
1217 | + return { bottom: '0', left: '0' }; | ||
1218 | + } else if (op === 'center left') { | ||
1219 | + return { top: 'center', left: '0' }; | ||
1220 | + } | ||
1221 | + // if bottom and/or right is set to "center" change that to top and/or left set to "center" | ||
1222 | + if (op.bottom === "center") { | ||
1223 | + delete op.bottom; | ||
1224 | + op.top = "center"; | ||
1225 | + } | ||
1226 | + if (op.right === "center") { | ||
1227 | + delete op.right; | ||
1228 | + op.left = "center"; | ||
1229 | + } | ||
1230 | + return optionPosition; | ||
1231 | + }, | ||
1232 | + | ||
1233 | + // converts option.size string to object | ||
1234 | + rewriteOSize: function (optionSize) { | ||
1235 | + var oSize = optionSize; | ||
1236 | + if (typeof oSize === 'string' && oSize === 'auto') { | ||
1237 | + oSize = { | ||
1238 | + width: 'auto', | ||
1239 | + height: 'auto' | ||
1240 | + }; | ||
1241 | + } | ||
1242 | + return oSize; | ||
1243 | + }, | ||
1244 | + | ||
1245 | + // set default options for hints and add necessary classes | ||
1246 | + setHintDefaults: function (panel) { | ||
1247 | + panel.option.resizable = false; | ||
1248 | + panel.option.draggable = false; | ||
1249 | + panel.option.removeHeader = true; | ||
1250 | + panel.option.toolbarFooter = false; | ||
1251 | + panel.option.show = 'fadeIn'; | ||
1252 | + panel.addClass('jsPanel-hint'); | ||
1253 | + panel.content.addClass('jsPanel-hint-content'); | ||
1254 | + // autoclose default 8 sec | or -1 to deactivate | ||
1255 | + if (!panel.option.autoclose) { | ||
1256 | + panel.option.autoclose = 8000; | ||
1257 | + } else if (panel.option.autoclose < 0) { | ||
1258 | + panel.option.autoclose = false; | ||
1259 | + } | ||
1260 | + // add class according option.theme to color the hint background | ||
1261 | + panel.content.addClass('jsPanel-hint-' + panel.option.theme); | ||
1262 | + panel.content.append('<div class="jsPanel-hint-close jsglyph jsglyph-remove"></div>'); | ||
1263 | + }, | ||
1264 | + | ||
1265 | + // set default options for standard modal | ||
1266 | + setModalDefaults: function (panel) { | ||
1267 | + panel.option.selector = 'body'; | ||
1268 | + panel.option.show = 'fadeIn'; | ||
1269 | + panel.addClass('jsPanel-modal'); | ||
1270 | + if (panel.option.paneltype.mode === 'default') { | ||
1271 | + panel.option.resizable = false; | ||
1272 | + panel.option.draggable = false; | ||
1273 | + panel.option.removeHeader = false; | ||
1274 | + panel.option.position = { top: 'center', left: 'center' }; | ||
1275 | + panel.option.offset = { top: 0, left: 0 }; | ||
1276 | + panel.option.controls.buttons = 'closeonly'; //do not delete else "modal" with no close button possible | ||
1277 | + $(".jsPanel-btn-min, .jsPanel-btn-norm, .jsPanel-btn-max, .jsPanel-btn-small, .jsPanel-btn-smallrev", panel).remove(); | ||
1278 | + $(panel.header, panel.header.title, panel.footer).css('cursor', 'default'); | ||
1279 | + $('.jsPanel-title', panel).css('cursor', 'inherit'); | ||
1280 | + } | ||
1281 | + }, | ||
1282 | + | ||
1283 | + // set right-to-left text direction and language; set styles and reoorder controls for rtl | ||
1284 | + setRTL: function (panel) { | ||
1285 | + var elmts = [panel.header.title, panel.content, panel.header.toolbar, panel.footer]; | ||
1286 | + elmts.forEach(function (item) { | ||
1287 | + item.prop('dir', 'rtl'); | ||
1288 | + if (panel.option.rtl.lang) { | ||
1289 | + item.prop('lang', panel.option.rtl.lang); | ||
1290 | + } | ||
1291 | + }); | ||
1292 | + panel.header.title.css('text-align', 'right'); | ||
1293 | + $('.jsPanel-btn-close', panel.header.controls).insertAfter($('.jsPanel-btn-min', panel.header.controls)); | ||
1294 | + $('.jsPanel-btn-max', panel.header.controls).insertAfter($('.jsPanel-btn-min', panel.header.controls)); | ||
1295 | + $('.jsPanel-btn-small', panel.header.controls).insertBefore($('.jsPanel-btn-min', panel.header.controls)); | ||
1296 | + $('.jsPanel-btn-smallrev', panel.header.controls).insertBefore($('.jsPanel-btn-min', panel.header.controls)); | ||
1297 | + $('.jsPanel-hdr-r', panel).css({ left: '0px', right: '', position: 'relative', 'float': 'left' }); | ||
1298 | + $('.jsPanel-hint-close', panel).css('float', 'left'); | ||
1299 | + $('.jsPanel-title', panel).css('float', 'right'); | ||
1300 | + $('.jsPanel-ftr', panel).append('<div style="clear:both;height:0;"></div>'); | ||
1301 | + $('button', panel.footer).css('float', 'left'); | ||
1302 | + }, | ||
1303 | + | ||
1304 | + // set default options for tooltips | ||
1305 | + setTooltipDefaults: function (panel) { | ||
1306 | + panel.option.position = {}; | ||
1307 | + panel.option.resizable = false; | ||
1308 | + panel.option.draggable = false; | ||
1309 | + panel.option.show = 'fadeIn'; | ||
1310 | + panel.option.controls.buttons = 'closeonly'; | ||
1311 | + panel.header.title.css('cursor', 'inherit'); | ||
1312 | + panel.footer.css('cursor', 'inherit'); | ||
1313 | + panel.addClass('jsPanel-tt'); | ||
1314 | + }, | ||
1315 | + | ||
1316 | + // returns a z-index value for a panel in order to have it on top | ||
1317 | + setZi: function (panel) { | ||
1318 | + var jspanel, allZi = [], maxZi; | ||
1319 | + if (typeof panel === "string") { | ||
1320 | + jspanel = $(panel); | ||
1321 | + } else { | ||
1322 | + jspanel = panel; | ||
1323 | + } | ||
1324 | + // build array with all z-index values | ||
1325 | + $(".jsPanel:not('.jsPanel-modal, .jsPanel-nofront')").each(function (i, elmt) { | ||
1326 | + if (jspanel.attr("id") !== $(elmt).attr("id")) { | ||
1327 | + allZi.push($(elmt).css("z-index")); | ||
1328 | + } | ||
1329 | + }); | ||
1330 | + //allZi.sort(function(a, b) {return a - b}); // sort array ascending | ||
1331 | + //console.log(allZi); | ||
1332 | + maxZi = this.getMaxOfArray(allZi); | ||
1333 | + return maxZi + 1; | ||
1334 | + }, | ||
1335 | + | ||
1336 | + // shift tooltip left/right if it overflows window; when using horizontal offsets of panel and/or corner result might be not as expected | ||
1337 | + shiftTooltipHorizontal: function (panel) { | ||
1338 | + var margins = this.getMargins(panel), | ||
1339 | + leftShiftRequired, | ||
1340 | + maxShift = this.getMaxpanelshift(panel), | ||
1341 | + maxLeftShift = maxShift.maxshiftH, | ||
1342 | + shift, | ||
1343 | + maxCornerLeft = maxShift.maxCornerH, | ||
1344 | + cornerShift, | ||
1345 | + newPanelLeft = 0, | ||
1346 | + newCornerLeft = 0; | ||
1347 | + if (margins.marginLeft < 0 && margins.marginRight > 0) { | ||
1348 | + // if panel overflows left window border | ||
1349 | + leftShiftRequired = Math.abs(margins.marginLeft) + 5 || 0; | ||
1350 | + shift = Math.min(leftShiftRequired, maxLeftShift) || 0; | ||
1351 | + cornerShift = Math.min(maxCornerLeft, shift) || 0; | ||
1352 | + newPanelLeft = parseInt(panel.css('left')) + shift + "px"; | ||
1353 | + newCornerLeft = parseInt($('.jsPanel-corner', panel).css('left')) - cornerShift + "px"; | ||
1354 | + } else if (margins.marginRight < 0 && margins.marginLeft > 0) { | ||
1355 | + // if panel overflows right window border | ||
1356 | + leftShiftRequired = Math.abs(margins.marginRight) + 5 || 0; | ||
1357 | + shift = Math.min(leftShiftRequired, maxLeftShift) || 0; | ||
1358 | + cornerShift = Math.min(maxCornerLeft, shift) || 0; | ||
1359 | + newPanelLeft = parseInt(panel.css('left')) - shift + "px"; | ||
1360 | + newCornerLeft = parseInt($('.jsPanel-corner', panel).css('left')) + cornerShift + "px"; | ||
1361 | + } | ||
1362 | + if ((margins.marginLeft < 0 && margins.marginRight > 0) || (margins.marginRight < 0 && margins.marginLeft > 0)) { | ||
1363 | + // shift panel | ||
1364 | + panel.animate({ | ||
1365 | + "left": newPanelLeft | ||
1366 | + }, { queue: false /* to have both animation run simultaneously */ }); | ||
1367 | + | ||
1368 | + // shift corner if present | ||
1369 | + if ($('.jsPanel-corner', panel)) { | ||
1370 | + $('.jsPanel-corner', panel).animate({ | ||
1371 | + "left": newCornerLeft | ||
1372 | + }, { queue: false /* to have both animation run simultaneously */ }); | ||
1373 | + } | ||
1374 | + } | ||
1375 | + }, | ||
1376 | + | ||
1377 | + // shift tooltip up/down if it overflows window; when using vertical offsets of panel and/or corner result might be not as expected | ||
1378 | + shiftTooltipVertical: function (panel) { | ||
1379 | + //console.log( parseInt($('*:first-child', panel.parent()).css('margin-left')) ); | ||
1380 | + var margins = this.getMargins(panel), | ||
1381 | + topShiftRequired, | ||
1382 | + maxShift = this.getMaxpanelshift(panel), | ||
1383 | + maxTopShift = maxShift.maxshiftV, | ||
1384 | + shift, | ||
1385 | + maxCornerTop = maxShift.maxCornerV, | ||
1386 | + cornerShift, | ||
1387 | + newPanelTop = 0, | ||
1388 | + newCornerTop = 0; | ||
1389 | + if (margins.marginTop < 0 && margins.marginBottom > 0) { | ||
1390 | + // if panel overflows top window border | ||
1391 | + topShiftRequired = Math.abs(margins.marginTop) + 5 || 0; | ||
1392 | + shift = Math.min(topShiftRequired, maxTopShift) || 0; | ||
1393 | + cornerShift = Math.min(maxCornerTop, shift) || 0; | ||
1394 | + newPanelTop = parseInt(panel.css('top')) + shift + "px"; | ||
1395 | + newCornerTop = parseInt($('.jsPanel-corner', panel).css('top')) - cornerShift + "px"; | ||
1396 | + } else if (margins.marginBottom < 0 && margins.marginTop > 0) { | ||
1397 | + // if panel overflows bottom window border | ||
1398 | + topShiftRequired = Math.abs(margins.marginBottom) + 5 || 0; | ||
1399 | + shift = Math.min(topShiftRequired, maxTopShift) || 0; | ||
1400 | + cornerShift = Math.min(maxCornerTop, shift) || 0; | ||
1401 | + newPanelTop = parseInt(panel.css('top')) - shift + "px"; | ||
1402 | + newCornerTop = parseInt($('.jsPanel-corner', panel).css('top')) + cornerShift + "px"; | ||
1403 | + } | ||
1404 | + if ((margins.marginTop < 0 && margins.marginBottom > 0) || (margins.marginBottom < 0 && margins.marginTop > 0)) { | ||
1405 | + // shift panel | ||
1406 | + panel.animate({ | ||
1407 | + "top": newPanelTop | ||
1408 | + }, { queue: false /* to have both animation run simultaneously */ }); | ||
1409 | + | ||
1410 | + // shift corner if present | ||
1411 | + if ($('.jsPanel-corner', panel)) { | ||
1412 | + $('.jsPanel-corner', panel).animate({ | ||
1413 | + "top": newCornerTop | ||
1414 | + }, { queue: false /* to have both animation run simultaneously */ }); | ||
1415 | + } | ||
1416 | + } | ||
1417 | + }, | ||
1418 | + | ||
1419 | + smallify: function (panel) { | ||
1420 | + var statusNew; | ||
1421 | + if ((panel.status !== "smallified" || panel.option.panelstatus !== "smallified") && (panel.status !== "smallifiedMax" || panel.option.panelstatus !== "smallifiedMax")) { | ||
1422 | + if (panel.status === "maximized" || panel.option.panelstatus === "maximized") { | ||
1423 | + statusNew = "smallifiedMax"; | ||
1424 | + } else { | ||
1425 | + statusNew = "smallified"; | ||
1426 | + } | ||
1427 | + // store panel height in function property | ||
1428 | + panel.smallify.height = panel.outerHeight(); | ||
1429 | + panel.panelheaderheight = panel.header.outerHeight() - 2; | ||
1430 | + panel.panelfooterheight = panel.footer.outerHeight(); | ||
1431 | + panel.panelcontentheight = panel.content.outerHeight(); | ||
1432 | + panel.animate({ | ||
1433 | + height: panel.panelheaderheight | ||
1434 | + }, | ||
1435 | + { | ||
1436 | + done: function () { | ||
1437 | + if (panel.status === 'maximized' || panel.option.panelstatus === 'maximized') { | ||
1438 | + jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-small", panel); | ||
1439 | + } else { | ||
1440 | + jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-small", panel); | ||
1441 | + } | ||
1442 | + jsPanel.updateStateProps(panel, statusNew); | ||
1443 | + panel.trigger('jspanel' + statusNew, panel.attr('id')); | ||
1444 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1445 | + } | ||
1446 | + }); | ||
1447 | + } | ||
1448 | + }, | ||
1449 | + | ||
1450 | + unsmallify: function (panel) { | ||
1451 | + panel.animate({ | ||
1452 | + height: panel.smallify.height | ||
1453 | + }, | ||
1454 | + { | ||
1455 | + done: function () { | ||
1456 | + if (panel.status === 'smallified' || panel.option.panelstatus === 'smallified') { | ||
1457 | + jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", panel); | ||
1458 | + jsPanel.updateStateProps(panel, "normalized"); | ||
1459 | + panel.trigger('jspanelnormalized', panel.attr('id')); | ||
1460 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1461 | + } else { | ||
1462 | + jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-smallrev", panel); | ||
1463 | + jsPanel.updateStateProps(panel, "maximized"); | ||
1464 | + panel.trigger('jspanelmaximized', panel.attr('id')); | ||
1465 | + panel.trigger('jspanelstatechange', panel.attr('id')); | ||
1466 | + } | ||
1467 | + } | ||
1468 | + } | ||
1469 | + ); | ||
1470 | + }, | ||
1471 | + | ||
1472 | + // updates option.position to hold actual values | ||
1473 | + updateOptionPosition: function (panel) { | ||
1474 | + panel.option.position.top = panel.css('top'); | ||
1475 | + panel.option.position.left = panel.css('left'); | ||
1476 | + }, | ||
1477 | + | ||
1478 | + // updates option.size to hold actual values | ||
1479 | + updateOptionSize: function (panel) { | ||
1480 | + panel.option.size.width = panel.css('width'); | ||
1481 | + panel.option.size.height = $(".jsPanel-content", panel).css("height"); | ||
1482 | + }, | ||
1483 | + | ||
1484 | + updateCustomData: function (panel, key, val) { | ||
1485 | + var custom = panel.data("custom"); | ||
1486 | + custom[key] = val; | ||
1487 | + panel.data("custom", custom); | ||
1488 | + }, | ||
1489 | + | ||
1490 | + updateStateProps: function (panel, status) { | ||
1491 | + panel.status = status; | ||
1492 | + panel.option.panelstatus = status; | ||
1493 | + panel.data("panelstatus", status); | ||
1494 | + panel.alterClass("jsPanel-state-*", "jsPanel-state-" + status); | ||
1495 | + }, | ||
1496 | + | ||
1497 | + getScope: function (ctrlName) { | ||
1498 | + var sel = 'div[ng-controller="' + ctrlName + '"]'; | ||
1499 | + return angular.element(sel).scope(); | ||
1500 | + }, | ||
1501 | + | ||
1502 | + getRootScope: function (controllerName) { | ||
1503 | + var $body = angular.element(document.body); // 1 | ||
1504 | + return $body.scope().$root; | ||
1505 | + | ||
1506 | + } | ||
1507 | +}; | ||
1508 | + | ||
1509 | +console.log("jsPanel version: " + jsPanel.version); | ||
1510 | + | ||
1511 | +(function ($) { | ||
1512 | + $.jsPanel = function (config) { | ||
1513 | + | ||
1514 | + | ||
1515 | + var jsP, template, id, | ||
1516 | + panelconfig = config || {}, | ||
1517 | + optConfig = panelconfig.config || {}; | ||
1518 | + | ||
1519 | + // use custom jsPanel template if present else standard template | ||
1520 | + template = panelconfig.template || jsPanel.template; | ||
1521 | + jsP = $(template); | ||
1522 | + | ||
1523 | + // Extend our default config with those provided. Note that the first arg to extend is an empty object - this is to keep from overriding our "defaults" object. | ||
1524 | + jsP.option = $.extend(true, {}, $.jsPanel.defaults, optConfig, panelconfig); | ||
1525 | + | ||
1526 | + // option.id --------------------------------------------------------------------------------------------------- | ||
1527 | + if (typeof jsP.option.id === "string") { | ||
1528 | + id = jsP.option.id; | ||
1529 | + } else if ($.isFunction(jsP.option.id)) { | ||
1530 | + id = jsP.option.id(); | ||
1531 | + } else { | ||
1532 | + jsPanel.ID += 1; | ||
1533 | + id = jsPanel.ID; | ||
1534 | + } | ||
1535 | + if ($("#" + id).length > 0) { | ||
1536 | + alert("jsPanel Error: No jsPanel created - id attribute passed with option.id already exists in document"); | ||
1537 | + return false; | ||
1538 | + } else { | ||
1539 | + jsP.attr("id", id); | ||
1540 | + } | ||
1541 | + | ||
1542 | + jsP.data("custom", jsP.option.custom); | ||
1543 | + | ||
1544 | + jsP.verticalOffset = 0; // always use 0 ... not "0" ! | ||
1545 | + | ||
1546 | + try { | ||
1547 | + jsP.parentElmt = $(jsP.option.selector).first(); | ||
1548 | + jsP.parentElmtTagname = jsP.parentElmt[0].tagName.toLowerCase(); | ||
1549 | + jsP.count = jsP.parentElmt.children('.jsPanel').length; | ||
1550 | + } catch (e) { | ||
1551 | + alert(e + "\n\nThe element you want to append the jsPanel to does not exist!\n\n The jsPanel will be appended to the body element instead."); | ||
1552 | + jsP.option.selector = 'body'; | ||
1553 | + jsP.parentElmt = $('body'); | ||
1554 | + jsP.parentElmtTagname = 'body'; | ||
1555 | + jsP.count = jsP.parentElmt.children('.jsPanel').length; | ||
1556 | + } | ||
1557 | + | ||
1558 | + jsP.status = "initialized"; | ||
1559 | + | ||
1560 | + jsP.header = $('.jsPanel-hdr', jsP); | ||
1561 | + | ||
1562 | + jsP.header.title = $('.jsPanel-title', jsP.header); | ||
1563 | + | ||
1564 | + jsP.header.controls = $('.jsPanel-hdr-r', jsP.header); | ||
1565 | + | ||
1566 | + jsP.header.toolbar = $('.jsPanel-hdr-toolbar', jsP.header); | ||
1567 | + | ||
1568 | + jsP.content = $('.jsPanel-content', jsP); | ||
1569 | + | ||
1570 | + jsP.footer = $('.jsPanel-ftr', jsP); | ||
1571 | + | ||
1572 | + jsP.normalize = function () { | ||
1573 | + jsPanel.normalize(jsP); | ||
1574 | + return jsP; | ||
1575 | + }; | ||
1576 | + | ||
1577 | + jsP.close = function () { | ||
1578 | + // alert('1') | ||
1579 | + jsPanel.close(jsP); | ||
1580 | + // no need to return something | ||
1581 | + }; | ||
1582 | + | ||
1583 | + jsP.closeChildpanels = function () { | ||
1584 | + jsPanel.closeChildpanels(jsP); | ||
1585 | + return jsP; | ||
1586 | + }; | ||
1587 | + | ||
1588 | + jsP.minimize = function () { | ||
1589 | + jsPanel.minimize(jsP); | ||
1590 | + return jsP; | ||
1591 | + }; | ||
1592 | + | ||
1593 | + jsP.maximize = function () { | ||
1594 | + jsPanel.maximize(jsP); | ||
1595 | + return jsP; | ||
1596 | + }; | ||
1597 | + | ||
1598 | + jsP.smallify = function () { | ||
1599 | + if ((jsP.status === "normalized" || jsP.option.panelstatus === "normalized") || (jsP.status === "maximized" || jsP.option.panelstatus === "maximized")) { | ||
1600 | + jsPanel.smallify(jsP); | ||
1601 | + } else if ((jsP.status !== "minimized" || jsP.option.panelstatus !== "minimized")) { | ||
1602 | + jsPanel.unsmallify(jsP); | ||
1603 | + } | ||
1604 | + return jsP; | ||
1605 | + }; | ||
1606 | + | ||
1607 | + jsP.front = function () { | ||
1608 | + jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1609 | + return jsP; | ||
1610 | + }; | ||
1611 | + | ||
1612 | + jsP.title = function (text) { | ||
1613 | + if (text && typeof text === "string") { | ||
1614 | + jsP.header.title.html(text); | ||
1615 | + return jsP; | ||
1616 | + } else if (arguments.length === 0) { | ||
1617 | + return jsP.header.title.html(); | ||
1618 | + } | ||
1619 | + }; | ||
1620 | + | ||
1621 | + jsP.addToolbar = function (place, items) { | ||
1622 | + jsPanel.addToolbar(jsP, place, items); | ||
1623 | + return jsP; | ||
1624 | + }; | ||
1625 | + | ||
1626 | + jsP.control = function (action, btn) { | ||
1627 | + jsPanel.control(jsP, action, btn); | ||
1628 | + return jsP; | ||
1629 | + }; | ||
1630 | + | ||
1631 | + jsP.resize = function (width, height) { | ||
1632 | + // alert('jsP.resize') | ||
1633 | + // method resizes the full panel (not content section only) | ||
1634 | + jsPanel.resize(jsP, width, height); | ||
1635 | + return jsP; | ||
1636 | + }; | ||
1637 | + | ||
1638 | + jsP.reposition = function (position, selector) { | ||
1639 | + jsPanel.reposition(jsP, position, selector); | ||
1640 | + return jsP; | ||
1641 | + }; | ||
1642 | + | ||
1643 | + jsP.reloadContent = function () { | ||
1644 | + if (jsP.option.content) { | ||
1645 | + jsP.content.empty().append(jsP.option.content); | ||
1646 | + } else if (jsP.option.load) { | ||
1647 | + jsP.content.empty(); | ||
1648 | + jsPanel.load(jsP); | ||
1649 | + } else if (jsP.option.ajax) { | ||
1650 | + jsPanel.ajax(jsP); | ||
1651 | + } else if (jsP.option.iframe) { | ||
1652 | + jsPanel.iframe(jsP); | ||
1653 | + } | ||
1654 | + }; | ||
1655 | + | ||
1656 | + // handler to move panel to foreground on click | ||
1657 | + jsP.on('click', function (e) { | ||
1658 | + //alert('1') | ||
1659 | + // use of e.preventDefault(); would prevent events from inside a panel from firing properly | ||
1660 | + if (!$(e.target).is("a[href], button, .jsPanel-nofront, .jsPanel-nofront *")) { | ||
1661 | + if (!jsP.hasClass("jsPanel-modal")) { | ||
1662 | + jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1663 | + } | ||
1664 | + } | ||
1665 | + }); | ||
1666 | + | ||
1667 | + // jsPanel close | ||
1668 | + $('.jsPanel-btn-close', jsP).on('click', function (e) { | ||
1669 | + // alert('2') | ||
1670 | + e.preventDefault(); | ||
1671 | + //if (!jsP.option.controls.confirmClose) { | ||
1672 | + // jsPanel.close(jsP, jsP.parentElmtTagname); | ||
1673 | + //} else { | ||
1674 | + // if (window.confirm(jsP.option.controls.confirmClose) === true) { | ||
1675 | + // jsPanel.close(jsP, jsP.parentElmtTagname); | ||
1676 | + // } | ||
1677 | + //} | ||
1678 | + | ||
1679 | + //if ($('#jsPanel-1').length > 0) { | ||
1680 | + // $('.jsPanel-btn-norm').attr('style', 'display: block'); | ||
1681 | + // $('.jsPanel-btn-max').attr('style', 'display: block'); | ||
1682 | + //} | ||
1683 | + | ||
1684 | + var $scope = jsPanel.getRootScope('HomeController'); | ||
1685 | + $scope.openParent(jsP.option.parentSlug); | ||
1686 | + $scope.$apply(); | ||
1687 | + }); | ||
1688 | + | ||
1689 | + | ||
1690 | + | ||
1691 | + | ||
1692 | + // jsPanel minimize | ||
1693 | + $('.jsPanel-btn-min', jsP).on('click', function (e) { | ||
1694 | + // alert('minimized') | ||
1695 | + | ||
1696 | + e.preventDefault(); | ||
1697 | + jsPanel.minimize(jsP); | ||
1698 | + // debugger; | ||
1699 | + var headerTitle = $('.jsPanel-title'); | ||
1700 | + var title = headerTitle[0].innerHTML; | ||
1701 | + | ||
1702 | + var $rootscope = jsPanel.getRootScope('HomeController'); | ||
1703 | + //$rootscope.openParent(jsP.option.parentSlug); | ||
1704 | + $rootscope.setState('min', title); | ||
1705 | + $rootscope.$apply(); | ||
1706 | + | ||
1707 | + var currentController = jsP.option.currentController; | ||
1708 | + if (currentController == 'DAController') { | ||
1709 | + var $scope = jsPanel.getScope(currentController); | ||
1710 | + var canvasDiv = document.getElementById('canvasDiv'); | ||
1711 | + $scope.imageVerticalScrollPosition = canvasDiv.scrollTop; | ||
1712 | + $scope.imageHorizontlScrollPosition = canvasDiv.scrollLeft; | ||
1713 | + $scope.$apply(); | ||
1714 | + } | ||
1715 | + }); | ||
1716 | + | ||
1717 | + // jsPanel maximize | ||
1718 | + $('.jsPanel-btn-max', jsP).on('click', function (e) { | ||
1719 | + // debugger; | ||
1720 | + e.preventDefault(); | ||
1721 | + jsPanel.maximize(jsP); | ||
1722 | + | ||
1723 | + $('.jsPanel-btn-min').css('display', 'initial'); | ||
1724 | + $('.fa fa-minus').css('display', 'initial'); | ||
1725 | + var headerTitle = $('.jsPanel-title'); | ||
1726 | + var title = headerTitle[0].innerHTML; | ||
1727 | + var $rootscope = jsPanel.getRootScope('HomeController'); | ||
1728 | + //$rootscope.setState('max', title); | ||
1729 | + $rootscope.$apply(); | ||
1730 | + }); | ||
1731 | + | ||
1732 | + // jsPanel normalize | ||
1733 | + $('.jsPanel-btn-norm', jsP).on('click', function (e) { | ||
1734 | + // debugger; | ||
1735 | + e.preventDefault(); | ||
1736 | + jsPanel.normalize(jsP); | ||
1737 | + | ||
1738 | + var currentController = jsP.option.currentController; | ||
1739 | + if (currentController == 'DAController') { | ||
1740 | + var $scope = jsPanel.getScope(currentController); | ||
1741 | + | ||
1742 | + | ||
1743 | + $('#canvasDiv').scrollLeft($scope.imageHorizontlScrollPosition) | ||
1744 | + $('#canvasDiv').scrollTop($scope.imageVerticalScrollPosition) | ||
1745 | + | ||
1746 | + $scope.$apply(); | ||
1747 | + } | ||
1748 | + }); | ||
1749 | + | ||
1750 | + // jsPanel smallify | ||
1751 | + $('.jsPanel-btn-small', jsP).on('click', function (e) { | ||
1752 | + e.preventDefault(); | ||
1753 | + jsPanel.smallify(jsP); | ||
1754 | + }); | ||
1755 | + | ||
1756 | + // jsPanel unsmallify | ||
1757 | + $('.jsPanel-btn-smallrev', jsP).on('click', function (e) { | ||
1758 | + e.preventDefault(); | ||
1759 | + jsPanel.unsmallify(jsP); | ||
1760 | + }); | ||
1761 | + | ||
1762 | + // rewrite option.paneltype strings to objects and set defaults for option.paneltype | ||
1763 | + jsP.option.paneltype = jsPanel.rewriteOPaneltype(jsP.option.paneltype); | ||
1764 | + | ||
1765 | + // converts option.position string to object | ||
1766 | + jsP.option.position = jsPanel.rewriteOPosition(jsP.option.position); | ||
1767 | + | ||
1768 | + // converts option.size string to object | ||
1769 | + jsP.option.size = jsPanel.rewriteOSize(jsP.option.size); | ||
1770 | + | ||
1771 | + /* option.paneltype - override or set various settings depending on option.paneltype ------------------------ */ | ||
1772 | + if (jsP.option.paneltype.type === 'modal') { | ||
1773 | + // set defaults for standard modal | ||
1774 | + jsPanel.setModalDefaults(jsP); | ||
1775 | + // insert backdrop | ||
1776 | + if ($('.jsPanel-backdrop').length < 1) { | ||
1777 | + jsPanel.insertModalBackdrop(); | ||
1778 | + } | ||
1779 | + } else if (jsP.option.paneltype.type === 'tooltip') { | ||
1780 | + jsPanel.setTooltipDefaults(jsP); | ||
1781 | + // optionally remove all other tooltips | ||
1782 | + if (jsP.option.paneltype.solo) { | ||
1783 | + jsPanel.closeallTooltips(); | ||
1784 | + } | ||
1785 | + // calc top & left for the various tooltip positions | ||
1786 | + jsP.option.position = jsPanel.calcToooltipPosition(jsP.parentElmt, jsP.option); | ||
1787 | + // position the tooltip & add tooltip class | ||
1788 | + jsP.css({ | ||
1789 | + top: jsP.option.position.top, | ||
1790 | + left: jsP.option.position.left | ||
1791 | + }); | ||
1792 | + if (!jsP.parentElmt.parent().hasClass('jsPanel-tooltip-wrapper')) { | ||
1793 | + // wrap element serving as trigger in a div - will take the tooltip | ||
1794 | + jsP.parentElmt.wrap('<div class="jsPanel-tooltip-wrapper">'); | ||
1795 | + // append tooltip (jsPanel) to the wrapper div | ||
1796 | + jsP.parentElmt.parent().append(jsP); | ||
1797 | + if (jsP.option.paneltype.mode === 'semisticky') { | ||
1798 | + jsP.hover( | ||
1799 | + function () { | ||
1800 | + $.noop(); | ||
1801 | + }, | ||
1802 | + function () { | ||
1803 | + jsPanel.close(jsP); | ||
1804 | + } | ||
1805 | + ); | ||
1806 | + } else if (jsP.option.paneltype.mode === 'sticky') { | ||
1807 | + $.noop(); | ||
1808 | + } else { | ||
1809 | + jsP.option.controls.buttons = 'none'; | ||
1810 | + // tooltip will be removed whenever mouse leaves trigger | ||
1811 | + jsP.parentElmt.off('mouseout'); // to prevent mouseout from firing several times | ||
1812 | + jsP.parentElmt.mouseout(function () { | ||
1813 | + jsPanel.close(jsP); | ||
1814 | + }); | ||
1815 | + } | ||
1816 | + } | ||
1817 | + // corners | ||
1818 | + jsP.css('overflow', 'visible'); | ||
1819 | + if (jsP.option.paneltype.cornerBG) { | ||
1820 | + var corner = $("<div></div>"), | ||
1821 | + cornerLoc = "jsPanel-corner-" + jsP.option.paneltype.position, | ||
1822 | + cornerPos, | ||
1823 | + cornerOX = parseInt(jsP.option.paneltype.cornerOX) || 0, | ||
1824 | + cornerOY = parseInt(jsP.option.paneltype.cornerOY) || 0, | ||
1825 | + cornerBG = jsP.option.paneltype.cornerBG; | ||
1826 | + if (jsP.option.paneltype.position !== "bottom") { | ||
1827 | + corner.addClass("jsPanel-corner " + cornerLoc).appendTo(jsP); | ||
1828 | + } else { | ||
1829 | + corner.addClass("jsPanel-corner " + cornerLoc).prependTo(jsP); | ||
1830 | + } | ||
1831 | + if (jsP.option.paneltype.position === "top") { | ||
1832 | + cornerPos = parseInt(jsP.option.size.width) / 2 - 12 + (cornerOX) + "px"; | ||
1833 | + corner.css({ borderTopColor: cornerBG, left: cornerPos }); | ||
1834 | + } else if (jsP.option.paneltype.position === "right") { | ||
1835 | + cornerPos = parseInt(jsP.option.size.height) / 2 - 12 + (cornerOY) + "px"; | ||
1836 | + corner.css({ borderRightColor: cornerBG, left: "-22px", top: cornerPos }); | ||
1837 | + } else if (jsP.option.paneltype.position === "bottom") { | ||
1838 | + cornerPos = parseInt(jsP.option.size.width) / 2 - 12 + (cornerOX) + "px"; | ||
1839 | + corner.css({ borderBottomColor: cornerBG, left: cornerPos, top: "-22px" }); | ||
1840 | + } else if (jsP.option.paneltype.position === "left") { | ||
1841 | + cornerPos = parseInt(jsP.option.size.height) / 2 - 12 + (cornerOY) + "px"; | ||
1842 | + corner.css({ borderLeftColor: cornerBG, left: jsP.option.size.width, top: cornerPos }); | ||
1843 | + } | ||
1844 | + } | ||
1845 | + } else if (jsP.option.paneltype.type === 'hint') { | ||
1846 | + jsPanel.setHintDefaults(jsP); | ||
1847 | + // bind callback for close button | ||
1848 | + $('.jsPanel-hint-close', jsP).on('click', jsP, function (event) { | ||
1849 | + event.data.close(jsP); | ||
1850 | + }); | ||
1851 | + // set option.position for hints using 'top left', 'top center' or 'top right' | ||
1852 | + if (jsP.option.position.top === '0' && jsP.option.position.left === 'center') { | ||
1853 | + jsP.addClass("jsPanel-hint-tc"); | ||
1854 | + if ($(".jsPanel-hint-tc").length > 0) { | ||
1855 | + jsP.option.position = jsPanel.hintTop("jsPanel-hint-tc"); | ||
1856 | + } | ||
1857 | + } else if (jsP.option.position.top === '0' && jsP.option.position.left === '0') { | ||
1858 | + jsP.addClass("jsPanel-hint-tl"); | ||
1859 | + if ($(".jsPanel-hint-tl").length > 0) { | ||
1860 | + jsP.option.position = jsPanel.hintTop("jsPanel-hint-tl"); | ||
1861 | + } | ||
1862 | + } else if (jsP.option.position.top === '0' && jsP.option.position.right === '0') { | ||
1863 | + jsP.addClass("jsPanel-hint-tr"); | ||
1864 | + if ($(".jsPanel-hint-tr").length > 0) { | ||
1865 | + jsP.option.position = jsPanel.hintTop("jsPanel-hint-tr"); | ||
1866 | + } | ||
1867 | + } | ||
1868 | + } | ||
1869 | + | ||
1870 | + /* option.selector - append jsPanel only to the first object in selector ------------------------------------ */ | ||
1871 | + jsP.data("selector", jsP.option.selector); // needed for exportPanels() | ||
1872 | + if (jsP.option.paneltype.type !== 'tooltip') { | ||
1873 | + jsP.appendTo(jsP.parentElmt); | ||
1874 | + } | ||
1875 | + if (jsP.option.paneltype.type === 'modal') { | ||
1876 | + jsP.css('zIndex', 10001); | ||
1877 | + if (jsP.option.paneltype.mode === 'extended') { | ||
1878 | + $('.jsPanel-backdrop').css('z-index', '9998'); | ||
1879 | + } | ||
1880 | + } else { | ||
1881 | + if (!jsP.hasClass("jsPanel-modal")) { | ||
1882 | + jsP.css('z-index', jsPanel.setZi(jsP)); | ||
1883 | + } | ||
1884 | + } | ||
1885 | + | ||
1886 | + /* option.bootstrap & option.theme -------------------------------------------------------------------------- */ | ||
1887 | + if (jsP.option.bootstrap) { | ||
1888 | + // check whether a bootstrap compatible theme is used and set option.theme accordingly | ||
1889 | + jsP.option.theme = jsPanel.isBootstrapTheme(jsP.option.bootstrap); | ||
1890 | + jsP.option.controls.iconfont = 'bootstrap'; | ||
1891 | + jsP.alterClass('jsPanel-theme-*', 'panel panel-' + jsP.option.theme); | ||
1892 | + jsP.header.alterClass('jsPanel-theme-*', 'panel-heading'); | ||
1893 | + jsP.header.title.addClass('panel-title'); | ||
1894 | + jsP.content.alterClass('jsPanel-theme-*', 'panel-body'); | ||
1895 | + jsP.footer.addClass('panel-footer'); | ||
1896 | + // fix css problems for panels nested in other bootstrap panels | ||
1897 | + jsP.header.title.css('color', function () { | ||
1898 | + return jsP.header.css('color'); | ||
1899 | + }); | ||
1900 | + jsP.content.css('border-top-color', function () { | ||
1901 | + return jsP.header.css('border-top-color'); | ||
1902 | + }); | ||
1903 | + } else { | ||
1904 | + // activate normal non bootstrap themes | ||
1905 | + var components = [jsP, jsP.header, jsP.content, jsP.footer]; | ||
1906 | + components.forEach(function (elmt) { | ||
1907 | + $(elmt).alterClass('jsPanel-theme-*', 'jsPanel-theme-' + jsP.option.theme); | ||
1908 | + }); | ||
1909 | + } | ||
1910 | + | ||
1911 | + /* option.removeHeader; option.controls (buttons in header right) ------------------------------------------- */ | ||
1912 | + if (jsP.option.removeHeader) { | ||
1913 | + jsP.header.remove(); | ||
1914 | + } else { | ||
1915 | + jsPanel.configControls(jsP); | ||
1916 | + } | ||
1917 | + | ||
1918 | + /* insert iconfonts if option.iconfont set (default is "jsglyph") */ | ||
1919 | + if (jsP.option.controls.iconfont) { | ||
1920 | + jsPanel.configIconfont(jsP); | ||
1921 | + } else { | ||
1922 | + // if option.controls.iconfont === false restore old icon sprite | ||
1923 | + $('.jsPanel-btn-close, .jsPanel-btn-max, .jsPanel-btn-norm, .jsPanel-btn-min, .jsPanel-btn-small, .jsPanel-btn-smallrev', jsP.header.controls).empty(); | ||
1924 | + } | ||
1925 | + | ||
1926 | + /* option.toolbarHeader | default: false -------------------------------------------------------------------- */ | ||
1927 | + if (jsP.option.toolbarHeader && jsP.option.removeHeader === false) { | ||
1928 | + if (typeof jsP.option.toolbarHeader === 'string') { | ||
1929 | + jsP.header.toolbar.append(jsP.option.toolbarHeader); | ||
1930 | + } else if ($.isFunction(jsP.option.toolbarHeader)) { | ||
1931 | + jsP.header.toolbar.append(jsP.option.toolbarHeader(jsP.header)); | ||
1932 | + } else if ($.isArray(jsP.option.toolbarHeader)) { | ||
1933 | + jsPanel.configToolbar(jsP.option.toolbarHeader, jsP.header.toolbar, jsP); | ||
1934 | + } | ||
1935 | + // give toolbar the same font-family as title | ||
1936 | + jsP.header.toolbar.css("font-family", jsP.header.title.css("font-family")); | ||
1937 | + } | ||
1938 | + | ||
1939 | + /* option.toolbarFooter | default: false -------------------------------------------------------------------- */ | ||
1940 | + if (jsP.option.toolbarFooter) { | ||
1941 | + jsP.footer.css({ | ||
1942 | + display: 'block' | ||
1943 | + }); | ||
1944 | + if (typeof jsP.option.toolbarFooter === 'string') { | ||
1945 | + jsP.footer.append(jsP.option.toolbarFooter); | ||
1946 | + } else if ($.isFunction(jsP.option.toolbarFooter)) { | ||
1947 | + jsP.footer.append(jsP.option.toolbarFooter(jsP.footer)); | ||
1948 | + } else if ($.isArray(jsP.option.toolbarFooter)) { | ||
1949 | + jsPanel.configToolbar(jsP.option.toolbarFooter, jsP.footer, jsP); | ||
1950 | + } | ||
1951 | + // give toolbar the same font-family as title | ||
1952 | + jsP.footer.css("font-family", jsP.header.title.css("font-family")); | ||
1953 | + } | ||
1954 | + | ||
1955 | + /* option.rtl | default: false ------------------------------------------------------------------------------ */ | ||
1956 | + if (jsP.option.rtl.rtl === true) { | ||
1957 | + jsPanel.setRTL(jsP, jsP.option.rtl.lang); | ||
1958 | + } | ||
1959 | + | ||
1960 | + /* option.overflow | default: 'hidden' --------------------------------------------------------------------- */ | ||
1961 | + if (typeof jsP.option.overflow === 'string') { | ||
1962 | + jsP.content.css('overflow', jsP.option.overflow); | ||
1963 | + } else if ($.isPlainObject(jsP.option.overflow)) { | ||
1964 | + jsP.content.css({ | ||
1965 | + 'overflow-y': jsP.option.overflow.vertical, | ||
1966 | + 'overflow-x': jsP.option.overflow.horizontal | ||
1967 | + }); | ||
1968 | + } | ||
1969 | + | ||
1970 | + /* option.draggable ----------------------------------------------------------------------------------------- */ | ||
1971 | + if ($.isPlainObject(jsP.option.draggable)) { | ||
1972 | + // if jsPanel is childpanel | ||
1973 | + if (jsP.parent().hasClass('jsPanel-content')) { | ||
1974 | + jsP.option.draggable.containment = 'parent'; | ||
1975 | + } | ||
1976 | + // merge draggable settings and apply | ||
1977 | + jsP.option.customdraggable = $.extend(true, {}, $.jsPanel.defaults.draggable, jsP.option.draggable); | ||
1978 | + jsP.draggable(jsP.option.customdraggable); | ||
1979 | + } else if (jsP.option.draggable === 'disabled') { | ||
1980 | + // reset cursor, draggable deactivated | ||
1981 | + $('.jsPanel-title, .jsPanel-ftr', jsP).css('cursor', 'inherit'); | ||
1982 | + // jquery ui draggable initialize disabled to allow to query status | ||
1983 | + jsP.draggable({ disabled: true }); | ||
1984 | + } | ||
1985 | + | ||
1986 | + /* option.resizable ----------------------------------------------------------------------------------------- */ | ||
1987 | + if ($.isPlainObject(jsP.option.resizable)) { | ||
1988 | + jsP.option.customresizable = $.extend(true, {}, $.jsPanel.defaults.resizable, jsP.option.resizable); | ||
1989 | + jsP.resizable(jsP.option.customresizable); | ||
1990 | + } else if (jsP.option.resizable === 'disabled') { | ||
1991 | + // jquery ui resizable initialize disabled to allow to query status | ||
1992 | + jsP.resizable({ disabled: true }); | ||
1993 | + $('.ui-icon-gripsmall-diagonal-se', jsP).css({ 'background-image': 'none', 'text-indent': -9999 }); | ||
1994 | + $('.ui-resizable-handle', jsP).css({ 'cursor': 'inherit' }); | ||
1995 | + } | ||
1996 | + | ||
1997 | + /* option.content ------------------------------------------------------------------------------------------- */ | ||
1998 | + // option.content can be any valid argument for jQuery.append() | ||
1999 | + if (jsP.option.content) { | ||
2000 | + jsP.content.append(jsP.option.content); | ||
2001 | + jsP.data("content", jsP.option.content); | ||
2002 | + } | ||
2003 | + | ||
2004 | + /* option.load ---------------------------------------------------------------------------------------------- */ | ||
2005 | + if ($.isPlainObject(jsP.option.load) && jsP.option.load.url) { | ||
2006 | + jsPanel.load(jsP); | ||
2007 | + } | ||
2008 | + | ||
2009 | + /* option.ajax ---------------------------------------------------------------------------------------------- */ | ||
2010 | + if ($.isPlainObject(jsP.option.ajax) && jsP.option.ajax.url) { | ||
2011 | + jsPanel.ajax(jsP); | ||
2012 | + } | ||
2013 | + | ||
2014 | + /* option.size ---------------------------------------------------------------------------------------------- */ | ||
2015 | + jsP.content.css({ | ||
2016 | + width: jsP.option.size.width || 'auto', | ||
2017 | + height: jsP.option.size.height || 'auto' | ||
2018 | + }); | ||
2019 | + | ||
2020 | + // Important! limit title width; final adjustment follows later; otherwise title might be longer than panel width | ||
2021 | + jsP.header.title.css('width', jsP.content.width() - 90); | ||
2022 | + | ||
2023 | + /* option.iframe -------------------------------------------------------------------------------------------- */ | ||
2024 | + // implemented after option.size because option.size.width/height are either "auto" or pixel values already | ||
2025 | + if ($.isPlainObject(jsP.option.iframe) && (jsP.option.iframe.src || jsP.option.iframe.srcdoc)) { | ||
2026 | + jsPanel.iframe(jsP); | ||
2027 | + } | ||
2028 | + | ||
2029 | + /* option.position ------------------------------------------------------------------------------------------ */ | ||
2030 | + if (jsP.option.paneltype.type !== 'tooltip') { | ||
2031 | + // value "center" not allowed for option.position.bottom & option.position.right -> use top and/or left | ||
2032 | + // finally calculate & position the jsPanel | ||
2033 | + jsPanel.calcPanelposition(jsP); | ||
2034 | + } | ||
2035 | + | ||
2036 | + /* option.addClass ------------------------------------------------------------------------------------------ */ | ||
2037 | + if (typeof jsP.option.addClass.header === 'string') { | ||
2038 | + jsP.header.addClass(jsP.option.addClass.header); | ||
2039 | + } | ||
2040 | + if (typeof jsP.option.addClass.content === 'string') { | ||
2041 | + jsP.content.addClass(jsP.option.addClass.content); | ||
2042 | + } | ||
2043 | + if (typeof jsP.option.addClass.footer === 'string') { | ||
2044 | + jsP.footer.addClass(jsP.option.addClass.footer); | ||
2045 | + } | ||
2046 | + | ||
2047 | + // handlers for doubleclicks ----------------------------------------------------------------------------------- | ||
2048 | + // dblclicks disabled for normal modals, hints and tooltips | ||
2049 | + if (jsP.option.paneltype.mode !== "default") { | ||
2050 | + if (jsP.option.dblclicks) { | ||
2051 | + if (jsP.option.dblclicks.title) { | ||
2052 | + jsP.header.title.on('dblclick', function (e) { | ||
2053 | + e.preventDefault(); | ||
2054 | + jsPanel.dblclickhelper(jsP.option.dblclicks.title, jsP); | ||
2055 | + }); | ||
2056 | + } | ||
2057 | + if (jsP.option.dblclicks.content) { | ||
2058 | + jsP.content.on('dblclick', function (e) { | ||
2059 | + e.preventDefault(); | ||
2060 | + jsPanel.dblclickhelper(jsP.option.dblclicks.content, jsP); | ||
2061 | + }); | ||
2062 | + } | ||
2063 | + if (jsP.option.dblclicks.footer) { | ||
2064 | + jsP.footer.on('dblclick', function (e) { | ||
2065 | + e.preventDefault(); | ||
2066 | + jsPanel.dblclickhelper(jsP.option.dblclicks.footer, jsP); | ||
2067 | + }); | ||
2068 | + } | ||
2069 | + } | ||
2070 | + } | ||
2071 | + | ||
2072 | + /* option.show ---------------------------------------------------------------------------------------------- */ | ||
2073 | + if (!jsP.option.show) { | ||
2074 | + jsP.css({ | ||
2075 | + display: 'block', | ||
2076 | + opacity: 1 | ||
2077 | + }); | ||
2078 | + $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2079 | + $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2080 | + jsP.option.size = { | ||
2081 | + width: jsP.outerWidth(), | ||
2082 | + height: jsP.outerHeight() | ||
2083 | + }; | ||
2084 | + } else if (jsP.option.show.indexOf(" ") === -1) { | ||
2085 | + // if no space is found in "jsP.option.show" -> function anwenden | ||
2086 | + jsP[jsP.option.show]({ | ||
2087 | + done: function () { | ||
2088 | + // trigger custom event | ||
2089 | + $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2090 | + $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2091 | + jsP.option.size = { | ||
2092 | + width: jsP.outerWidth(), | ||
2093 | + height: jsP.outerHeight() | ||
2094 | + }; | ||
2095 | + } | ||
2096 | + }); | ||
2097 | + } else { | ||
2098 | + // does not work with certain combinations of type of animation and positioning | ||
2099 | + jsP.css({ | ||
2100 | + display: 'block', | ||
2101 | + opacity: 1 | ||
2102 | + }); | ||
2103 | + $(jsP).addClass(jsP.option.show); | ||
2104 | + $(jsP).trigger('jspanelloaded', jsP.attr('id')); | ||
2105 | + $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2106 | + jsP.option.size = { | ||
2107 | + width: jsP.outerWidth(), | ||
2108 | + height: jsP.outerHeight() | ||
2109 | + }; | ||
2110 | + } | ||
2111 | + | ||
2112 | + /* needed if a maximized panel in body is normalized again -------------------------------------------------- */ | ||
2113 | + // don't put this under $('body').on('jspanelloaded', function () { ... } | ||
2114 | + jsP.verticalOffset = jsPanel.calcVerticalOffset(jsP) || 0; | ||
2115 | + | ||
2116 | + /* replace bottom/right values with corresponding top/left values if necessary ------------------------------ */ | ||
2117 | + jsPanel.replaceCSSBottomRight(jsP); | ||
2118 | + | ||
2119 | + /* option.title | needs to be late in the file! ------------------------------------------------------------- */ | ||
2120 | + jsP.header.title.empty().prepend(jsP.option.title); | ||
2121 | + jsPanel.resizeTitle(jsP); | ||
2122 | + | ||
2123 | + /* reposition hints while scrolling window, must be after normalization of position ------------------------- */ | ||
2124 | + if (jsP.option.paneltype.type === 'hint') { | ||
2125 | + jsPanel.reposHintsScroll(jsP); | ||
2126 | + } | ||
2127 | + | ||
2128 | + /* reposition jsPanel appended to body while scrolling window ----------------------------------------------- */ | ||
2129 | + if (jsP.parentElmtTagname === 'body' && (jsP.option.paneltype.type !== 'tooltip' || jsP.option.paneltype.type !== 'hint')) { | ||
2130 | + jsPanel.fixPosition(jsP); | ||
2131 | + } | ||
2132 | + | ||
2133 | + /* resizestart & resizestop & dragstop callbacks ------------------------------------------------------------ */ | ||
2134 | + if (!jsP.option.paneltype || jsP.option.paneltype.mode !== 'default') { | ||
2135 | + // not needed for modals, hints and tooltips | ||
2136 | + $(jsP).on("resizestart", function () { | ||
2137 | + $("iframe", jsP.content).css("display", "none"); // on test | ||
2138 | + }); | ||
2139 | + | ||
2140 | + $(jsP).on("resize", function () { | ||
2141 | + // debugger; | ||
2142 | + // jquery ui resize event is also fired when panel is maximized or normalized (on request of Gareth Bult) | ||
2143 | + jsPanel.resizeContent(jsP); | ||
2144 | + jsPanel.resizeTitle(jsP); | ||
2145 | + }); | ||
2146 | + | ||
2147 | + $(jsP).on("resizestop", function () { | ||
2148 | + | ||
2149 | + //alert('resized') | ||
2150 | + jsP.option.size = { | ||
2151 | + width: jsP.outerWidth(), | ||
2152 | + height: jsP.outerHeight() | ||
2153 | + }; | ||
2154 | + if ($('.tools').length> 0) { | ||
2155 | + //nikita | ||
2156 | + if ($('#canvasDiv') != null) { | ||
2157 | + if (jsP.outerHeight() >= 435 && jsP.outerWidth() >= 650) { | ||
2158 | + // alert('resizestop') | ||
2159 | + $('#canvasDiv').css('height', jsP.outerHeight() - 85) | ||
2160 | + $('#canvasDiv').css('width', jsP.outerWidth() - 95) | ||
2161 | + $('#canvasDiv').css('overflow', 'scroll') | ||
2162 | + } | ||
2163 | + else { | ||
2164 | + $('#canvasDiv').css('height', jsP.outerHeight() - 110) | ||
2165 | + $('#canvasDiv').css('width', jsP.outerWidth() - 85) | ||
2166 | + $('#canvasDiv').css('overflow', 'scroll') | ||
2167 | + } | ||
2168 | + } | ||
2169 | + } | ||
2170 | + //nikita | ||
2171 | + // $('#leftToolBar').css('height', jsP.outerWidth()) | ||
2172 | + | ||
2173 | + jsPanel.updateStateProps(jsP, "normalized"); | ||
2174 | + $(jsP).trigger('jspanelnormalized', jsP.attr('id')); | ||
2175 | + $(jsP).trigger('jspanelstatechange', jsP.attr('id')); | ||
2176 | + // controls und title zurücksetzen | ||
2177 | + jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", jsP); | ||
2178 | + $("iframe", jsP.content).css("display", "block"); // on test | ||
2179 | + }); | ||
2180 | + | ||
2181 | + $(jsP).on("dragstart", function () { | ||
2182 | + // alert("dragstart") | ||
2183 | + // debugger; | ||
2184 | + // remove window.scroll handler, is added again on dragstop | ||
2185 | + $(window).off('scroll', jsP.jsPanelfixPos); | ||
2186 | + if (jsP.option.paneltype.mode === 'extended') { | ||
2187 | + jsP.css('z-index', '1'); | ||
2188 | + } | ||
2189 | + }); | ||
2190 | + | ||
2191 | + $(jsP).on("dragstop", function () { | ||
2192 | + // alert("dragstop") | ||
2193 | + // debugger; | ||
2194 | + jsP.option.position = { | ||
2195 | + top: jsP.css('top'), | ||
2196 | + left: jsP.css('left') | ||
2197 | + }; | ||
2198 | + jsP.verticalOffset = jsPanel.calcVerticalOffset(jsP) || 0; | ||
2199 | + if (jsP.parentElmtTagname === 'body') { | ||
2200 | + jsPanel.fixPosition(jsP); | ||
2201 | + } | ||
2202 | + }); | ||
2203 | + | ||
2204 | + $(jsP).on("jspanelminimized", function () { | ||
2205 | + jsPanel.hideControls(".jsPanel-btn-min, .jsPanel-btn-small, .jsPanel-btn-smallrev, .jsPanel-btn-hide", jsP); | ||
2206 | + jsPanel.updateStateProps(jsP, "minimized"); | ||
2207 | + $(window).off('scroll', jsP.jsPanelfixPos); | ||
2208 | + }); | ||
2209 | + | ||
2210 | + $(jsP).on("jspanelmaximized", function () { | ||
2211 | + // debugger; | ||
2212 | + jsPanel.resizeContent(jsP); | ||
2213 | + jsPanel.resizeTitle(jsP); | ||
2214 | + jsPanel.hideControls(".jsPanel-btn-max, .jsPanel-btn-smallrev", jsP); | ||
2215 | + jsPanel.updateStateProps(jsP, "maximized"); | ||
2216 | + // additionally trigger the jQuery UI resize event (on request of Gareth Bult) | ||
2217 | + jsP.trigger("resize"); | ||
2218 | + }); | ||
2219 | + | ||
2220 | + $(jsP).on("jspanelnormalized", function () { | ||
2221 | + jsPanel.hideControls(".jsPanel-btn-norm, .jsPanel-btn-smallrev", jsP); | ||
2222 | + jsPanel.resizeTitle(jsP); | ||
2223 | + jsPanel.resizeContent(jsP); | ||
2224 | + jsPanel.updateStateProps(jsP, "normalized"); | ||
2225 | + // additionally trigger the jQuery UI resize event (on request of Gareth Bult) | ||
2226 | + jsP.trigger("resize"); | ||
2227 | + }); | ||
2228 | + | ||
2229 | + } | ||
2230 | + | ||
2231 | + /* option.autoclose | default: false --------------------------------------- */ | ||
2232 | + if (typeof jsP.option.autoclose === 'number' && jsP.option.autoclose > 0) { | ||
2233 | + jsPanel.autoclose(jsP); | ||
2234 | + } | ||
2235 | + | ||
2236 | + /* tooltip corrections ----------------------------------------------------- */ | ||
2237 | + if (jsP.option.paneltype.type === "tooltip" && (jsP.option.paneltype.position === "top" || jsP.option.paneltype.position === "bottom")) { | ||
2238 | + jsPanel.shiftTooltipHorizontal(jsP, jsP.option.paneltype.shiftwithin); | ||
2239 | + } else if (jsP.option.paneltype.position === "left" || jsP.option.paneltype.position === "right") { | ||
2240 | + jsPanel.shiftTooltipVertical(jsP, jsP.option.paneltype.shiftwithin); | ||
2241 | + } | ||
2242 | + | ||
2243 | + /* option.panelstatus --------------------------------------------------------------------------------------- */ | ||
2244 | + if (jsP.option.panelstatus) { | ||
2245 | + switch (jsP.option.panelstatus) { | ||
2246 | + case "minimized": | ||
2247 | + jsPanel.minimize(jsP); | ||
2248 | + break; | ||
2249 | + case "maximized": | ||
2250 | + jsPanel.maximize(jsP); | ||
2251 | + break; | ||
2252 | + case ("smallified"): | ||
2253 | + jsPanel.smallify(jsP); | ||
2254 | + break; | ||
2255 | + case ("smallifiedMax"): | ||
2256 | + jsPanel.maximize(jsP); | ||
2257 | + jsPanel.smallify(jsP); | ||
2258 | + break; | ||
2259 | + } | ||
2260 | + } else { | ||
2261 | + jsPanel.updateStateProps(jsP, "normalized"); | ||
2262 | + } | ||
2263 | + | ||
2264 | + /* jsP.option.callback --------------------------------------------------------- */ | ||
2265 | + if ($.isFunction(jsP.option.callback)) { | ||
2266 | + jsP.option.callback.call(jsP, jsP); | ||
2267 | + } else if ($.isArray(jsP.option.callback)) { | ||
2268 | + jsP.option.callback.forEach(function (item) { | ||
2269 | + if ($.isFunction(item)) { | ||
2270 | + item.call(jsP, jsP); | ||
2271 | + } | ||
2272 | + }); | ||
2273 | + } | ||
2274 | + | ||
2275 | + | ||
2276 | + return jsP; | ||
2277 | + }; | ||
2278 | + | ||
2279 | + /* jsPanel.defaults */ | ||
2280 | + $.jsPanel.defaults = { | ||
2281 | + "addClass": { | ||
2282 | + header: false, | ||
2283 | + content: false, | ||
2284 | + footer: false | ||
2285 | + }, | ||
2286 | + "ajax": { | ||
2287 | + autoload: true | ||
2288 | + }, | ||
2289 | + "autoclose": false, | ||
2290 | + "bootstrap": false, | ||
2291 | + "callback": undefined, | ||
2292 | + "content": false, | ||
2293 | + "controls": { | ||
2294 | + buttons: true, | ||
2295 | + iconfont: 'jsglyph', | ||
2296 | + close: false, | ||
2297 | + confirmClose: false, | ||
2298 | + maximize: false, | ||
2299 | + minimize: false, | ||
2300 | + normalize: false, | ||
2301 | + smallify: false, | ||
2302 | + maxtoScreen: false | ||
2303 | + }, | ||
2304 | + "custom": false, | ||
2305 | + "dblclicks": false, | ||
2306 | + "draggable": { | ||
2307 | + handle: 'div.jsPanel-hdr, div.jsPanel-ftr', | ||
2308 | + stack: '.jsPanel', | ||
2309 | + opacity: 0.7 | ||
2310 | + }, | ||
2311 | + "id": function () { | ||
2312 | + jsPanel.ID += 1; | ||
2313 | + return 'jsPanel-' + jsPanel.ID; | ||
2314 | + }, | ||
2315 | + "iframe": false, | ||
2316 | + "load": false, | ||
2317 | + "maximizedMargin": { | ||
2318 | + top: 5, | ||
2319 | + right: 5, | ||
2320 | + bottom: 5, | ||
2321 | + left: 5 | ||
2322 | + }, | ||
2323 | + "offset": { | ||
2324 | + top: 0, | ||
2325 | + left: 0 | ||
2326 | + }, | ||
2327 | + "onbeforeclose": false, | ||
2328 | + "onbeforemaximize": false, | ||
2329 | + "onbeforeminimize": false, | ||
2330 | + "onbeforenormalize": false, | ||
2331 | + "onclosed": false, | ||
2332 | + "oncmaximized": false, | ||
2333 | + "onminimized": false, | ||
2334 | + "onnormalized": false, | ||
2335 | + "overflow": 'hidden', | ||
2336 | + "panelstatus": false, | ||
2337 | + "paneltype": false, | ||
2338 | + "position": 'auto', | ||
2339 | + "removeHeader": false, | ||
2340 | + "resizable": { | ||
2341 | + handles: 'n, e, s, w, ne, se, sw, nw', | ||
2342 | + autoHide: false, | ||
2343 | + minWidth: 150, | ||
2344 | + minHeight: 93 | ||
2345 | + }, | ||
2346 | + "rtl": false, | ||
2347 | + "selector": 'body', | ||
2348 | + "show": 'fadeIn', | ||
2349 | + "size": { | ||
2350 | + width: '400px', | ||
2351 | + height: '222px' | ||
2352 | + }, | ||
2353 | + "template": false, | ||
2354 | + "theme": 'default', | ||
2355 | + "title": 'jsPanel', | ||
2356 | + "toolbarFooter": false, | ||
2357 | + "toolbarHeader": false, | ||
2358 | + "currentController": '', | ||
2359 | + "parentSlug": '' | ||
2360 | + | ||
2361 | + }; | ||
2362 | + | ||
2363 | + | ||
2364 | + /* | ||
2365 | + * jQuery alterClass plugin | ||
2366 | + * Remove element classes with wildcard matching. Optionally add classes: | ||
2367 | + * $( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) | ||
2368 | + * Copyright (c) 2011 Pete Boere (the-echoplex.net) | ||
2369 | + * Free under terms of the MIT license: http://www.opensource.org/licenses/mit-license.php | ||
2370 | + */ | ||
2371 | + $.fn.alterClass = function (removals, additions) { | ||
2372 | + | ||
2373 | + var self = this, | ||
2374 | + patt; | ||
2375 | + if (removals.indexOf('*') === -1) { | ||
2376 | + // Use native jQuery methods if there is no wildcard matching | ||
2377 | + self.removeClass(removals); | ||
2378 | + return !additions ? self : self.addClass(additions); | ||
2379 | + } | ||
2380 | + patt = new RegExp('\\s' + | ||
2381 | + removals.replace(/\*/g, '[A-Za-z0-9-_]+').split(' ').join('\\s|\\s') + | ||
2382 | + '\\s', 'g'); | ||
2383 | + self.each(function (i, it) { | ||
2384 | + var cn = ' ' + it.className + ' '; | ||
2385 | + while (patt.test(cn)) { | ||
2386 | + cn = cn.replace(patt, ' '); | ||
2387 | + } | ||
2388 | + it.className = $.trim(cn); | ||
2389 | + }); | ||
2390 | + return !additions ? self : self.addClass(additions); | ||
2391 | + }; | ||
2392 | + | ||
2393 | + /* body click handler: remove all tooltips on click in body except click is inside tooltip */ | ||
2394 | + $('body').click(function (e) { | ||
2395 | + var pID, | ||
2396 | + isTT = $(e.target).closest('.jsPanel-tt').length; | ||
2397 | + if (isTT < 1) { | ||
2398 | + $('.jsPanel-tt').each(function () { | ||
2399 | + pID = $(this).attr('id'); | ||
2400 | + // if present remove tooltip wrapper and than remove tooltip | ||
2401 | + $('#' + pID).unwrap().remove(); | ||
2402 | + $('body').trigger('jspanelclosed', pID); | ||
2403 | + }); | ||
2404 | + } | ||
2405 | + }); | ||
2406 | + | ||
2407 | + | ||
2408 | + | ||
2409 | + | ||
2410 | +}(jQuery)); | ||
2411 | + | ||
2412 | +/* | ||
2413 | + :: Number.isInteger() polyfill :: | ||
2414 | + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger | ||
2415 | +*/ | ||
2416 | +if (!Number.isInteger) { | ||
2417 | + Number.isInteger = function isInteger(nVal) { | ||
2418 | + "use strict"; | ||
2419 | + return typeof nVal === 'number' && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; | ||
2420 | + }; | ||
2420 | } | 2421 | } |
2421 | \ No newline at end of file | 2422 | \ No newline at end of file |