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