Commit f1da288276b957a2ba27802150e4db313d1affe0

Authored by mangaldeep patel
1 parent 5cd97326

AdamImagesBug

400-SOURCECODE/AIAHTML5.Web/app/controllers/AIController.js
... ... @@ -631,7 +631,7 @@ function ($scope, $window, $rootScope, $compile, $http, log, $location, $timeout
631 631 title: $rootScope.getLocalStorageValue("currentViewTitle"),
632 632 position: {
633 633 top: 70,
634   - left: 20,
  634 + left: 2,
635 635 },
636 636  
637 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 5426 imageToPrint.src = dataURL;
5427 5427  
5428 5428 OpenJSPanel(); // open jsPanel here
5429   - if ($('#jsPanel-1').length > 0) {
5430   - $('.jsPanel-btn-norm').attr('style', 'display: block');
5431   - }
  5429 +
5432 5430  
5433 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 5474 $("#canvas").css("display", "none");
5477 5475 }
5478 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 2422 \ No newline at end of file
... ...