1 (function ($, rf) {
  2 
  3     rf.ui = rf.ui || {};
  4     var selectionEventHandler = function(event) {
  5         event.stopPropagation();
  6         event.preventDefault();
  7     };
  8 
  9     var disableSelection = function (element) {
 10         if (typeof element.onselectstart != "undefined") //IE
 11         {
 12             $(rf.getDomElement(element)).bind('selectstart', selectionEventHandler);
 13         }
 14         else //All other (ie: Opera)
 15         {
 16             $(rf.getDomElement(element)).bind('mousedown', selectionEventHandler);
 17         }
 18     };
 19 
 20     var enableSelection = function (element) {
 21         if (typeof element.onselectstart != "undefined") //IE
 22         {
 23             $(rf.getDomElement(element)).unbind('selectstart', selectionEventHandler);
 24         }
 25         else //All other (ie: Opera)
 26         {
 27             $(rf.getDomElement(element)).unbind('mousedown', selectionEventHandler);
 28         }
 29     };
 30 
 31     var defaultOptions = {
 32         width:-1,
 33         height:-1,
 34         minWidth:-1,
 35         minHeight:-1,
 36         modal:true,
 37         moveable:true,
 38         resizeable: false,
 39         autosized: false,
 40         left: "auto",
 41         top : "auto",
 42         zindex:100,
 43         shadowDepth : 5,
 44         shadowOpacity: 0.1,
 45         attachToBody:true
 46     };
 47 
 48 
 49     rf.ui.PopupPanel = function(id, options) {
 50 
 51         $super.constructor.call(this, id);
 52         this.markerId = id;
 53         this.attachToDom(this.markerId);
 54         this.options = $.extend(this.options, defaultOptions, options || {});
 55 
 56         this.minWidth = this.getMinimumSize(this.options.minWidth);
 57         this.minHeight = this.getMinimumSize(this.options.minHeight);
 58         this.maxWidth = this.options.maxWidth;
 59         this.maxHeight = this.options.maxHeight;
 60 
 61         this.baseZIndex = this.options.zindex;
 62 
 63         this.div = $(rf.getDomElement(id));
 64         this.cdiv = $(rf.getDomElement(id + "_container"));
 65         this.contentDiv = $(rf.getDomElement(id + "_content"));
 66         this.shadowDiv = $(rf.getDomElement(id + "_shadow"));
 67         this.shadeDiv = $(rf.getDomElement(id + "_shade"));
 68         this.scrollerDiv = $(rf.getDomElement(id + "_content_scroller"));
 69 
 70         $(this.shadowDiv).css("opacity", this.options.shadowOpacity);
 71         this.shadowDepth = parseInt(this.options.shadowDepth);
 72 
 73         this.borders = new Array();
 74         this.firstHref = $(rf.getDomElement(id + "FirstHref"));
 75         if (this.options.resizeable) {
 76             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerN", this, "N-resize", rf.ui.PopupPanel.Sizer.N));
 77             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerE", this, "E-resize", rf.ui.PopupPanel.Sizer.E));
 78             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerS", this, "S-resize", rf.ui.PopupPanel.Sizer.S));
 79             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerW", this, "W-resize", rf.ui.PopupPanel.Sizer.W));
 80 
 81             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerNW", this, "NW-resize", rf.ui.PopupPanel.Sizer.NW));
 82             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerNE", this, "NE-resize", rf.ui.PopupPanel.Sizer.NE));
 83             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerSE", this, "SE-resize", rf.ui.PopupPanel.Sizer.SE));
 84             this.borders.push(new rf.ui.PopupPanel.Border(id + "ResizerSW", this, "SW-resize", rf.ui.PopupPanel.Sizer.SW));
 85         }
 86 
 87         if (this.options.moveable && rf.getDomElement(id + "_header")) {
 88             this.header = new rf.ui.PopupPanel.Border(id + "_header", this, "move", rf.ui.PopupPanel.Sizer.Header);
 89         } else {
 90             $(rf.getDomElement(id + "_header")).css('cursor', 'default');
 91         }
 92 
 93         this.cdiv.resize($.proxy(this.resizeListener, this));
 94     };
 95 
 96     rf.BaseComponent.extend(rf.ui.PopupPanel);
 97     var $super = rf.ui.PopupPanel.$super;
 98     $.extend(rf.ui.PopupPanel.prototype, (function (options) {
 99 
100         return {
101 
102             name: "PopupPanel",
103             saveInputValues: function(element) {
104                 /* Fix for RF-3856 - Checkboxes in modal panel does not hold their states after modal was closed and opened again */
105                 if (rf.browser.msie /* reproducible for checkbox/radio in IE6, radio in IE 7/8 beta 2 */) {
106                     $('input[type=checkbox], input[type=radio]', element).each(function(index) {
107                         $(this).defaultChecked = $(this).checked;
108                     });
109                 }
110             },
111 
112             width: function() {
113                 return this.getContentElement()[0].clientWidth;//TODO
114             },
115 
116             height: function() {
117                 return this.getContentElement()[0].clientHeight;//TODO
118             },
119 
120             getLeft : function () {
121                 return this.cdiv.css('left');
122             },
123 
124             getTop : function () {
125                 return this.cdiv.css('top');
126             },
127 
128             getInitialSize : function() {
129                 if (this.options.autosized) {
130                     return 15;
131                 } else {
132                     return $(rf.getDomElement(this.markerId + "_header_content")).height();
133                 }
134             },
135 
136             getContentElement: function() {
137                 if (!this._contentElement) {
138                     this._contentElement = this.cdiv;
139                 }
140 
141                 return this._contentElement;
142             },
143             getSizeElement : function() {
144                 return document.body;
145             },
146 
147             getMinimumSize : function(size) {
148                 return Math.max(size, 2 * this.getInitialSize() + 2);
149             },
150 
151             __getParsedOption: function(options, name) {
152                 var value = parseInt(options[name], 10);
153 
154                 if (value < 0 || isNaN(value)) {
155                     value = this[name];
156                 }
157 
158                 return value;
159             },
160 
161             destroy: function() {
162 
163                 this._contentElement = null;
164                 this.firstOutside = null;
165                 this.lastOutside = null;
166                 this.firstHref = null;
167                 this.parent = null;
168                 if (this.header) {
169                     this.header.destroy();
170                     this.header = null;
171                 }
172 
173                 for (var k = 0; k < this.borders.length; k++) {
174                     this.borders[k].destroy();
175                 }
176                 this.borders = null;
177 
178                 if (this.domReattached) {
179                     this.div.remove();
180                 }
181 
182                 this.markerId = null;
183                 this.options = null;
184 
185                 this.div = null;
186                 this.cdiv = null;
187                 this.contentDiv = null;
188                 this.shadowDiv = null;
189                 this.scrollerDiv = null;
190                 this.userOptions = null;
191                 this.eIframe = null;
192 
193                 $super.destroy.call(this);
194 
195             },
196 
197             initIframe : function() {
198                 if (this.contentWindow) {
199                     $(this.contentWindow.document.body).css("margin", "0px 0px 0px 0px");
200                 } else {
201                     //TODO opera etc.
202 
203                 }
204 
205                 if ("transparent" == $(document.body).css("background-color")) {
206                     $(this).css('filter', "alpha(opacity=0)");
207                     $(this).css('opacity', "0");
208                 }
209             },
210 
211             setLeft: function(pos) {
212                 if (!isNaN(pos)) {
213                     this.cdiv.css('left', pos + "px");
214                 }
215             },
216 
217             setTop: function(pos) {
218                 if (!isNaN(pos)) {
219                     this.cdiv.css('top', pos + "px");
220                 }
221             },
222 
223             show: function(event, opts) {
224                 var element = this.cdiv;
225                 if (!this.shown && this.invokeEvent("beforeshow", event, null, element)) {
226                     this.preventFocus();
227 
228 
229                     if (!this.domReattached) {
230                         this.parent = this.div.parent();
231 
232                         var domElementAttachment;
233                         if (opts) {
234                             domElementAttachment = opts.domElementAttachment;
235                         }
236 
237                         if (!domElementAttachment) {
238                             domElementAttachment = this.options.domElementAttachment;
239                         }
240 
241                         var newParent;
242                         if ('parent' == domElementAttachment) {
243                             newParent = this.parent;
244                         } else if ('form' == domElementAttachment) {
245                             newParent = this.findForm(element)[0] || document.body;
246                         } else {
247                             //default - body
248                             newParent = document.body;
249                         }
250 
251                         if (newParent != this.parent) {
252                             this.saveInputValues(element);
253                             this.shadeDiv.length && newParent.appendChild(this.shadeDiv.get(0));
254                             newParent.appendChild(this.cdiv.get(0));
255                             this.domReattached = true;
256                         } else {
257                             this.parent.show();
258                         }
259                     }
260 
261                     var forms = $("form", element);
262 
263                     if (this.options.keepVisualState && forms) {
264                         for (var i = 0; i < forms.length; i++) {
265                             var popup = this;
266                             $(forms[i]).bind("submit", {popup:popup}, this.setStateInput);
267                         }
268                     }
269 
270                     var options = {};
271                     this.userOptions = {};
272                     $.extend(options, this.options);
273 
274                     if (opts) {
275                         $.extend(options, opts);
276                         $.extend(this.userOptions, opts);
277                     }
278 
279                     // reset dimensions
280                     if (this.options.autosized) {
281                         if (options.left) {
282                             var _left;
283                             if (options.left != "auto") {
284                                 _left = parseInt(options.left, 10);
285                             } else {
286                                 var cw = this.__calculateWindowWidth();
287                                 var _width = this.width();
288                                 if (cw >= _width) {
289                                     _left = (cw - _width) / 2;
290                                 } else {
291                                     _left = 0;
292                                 }
293                             }
294 
295                             this.setLeft(Math.round(_left));
296                             $(this.shadowDiv).css("left", this.shadowDepth);
297                         }
298 
299                         if (options.top) {
300                             var _top;
301                             if (options.top != "auto") {
302                                 _top = parseInt(options.top, 10);
303                             } else {
304                                 var ch = this.__calculateWindowHeight();
305                                 var _height = this.height();
306                                 if (ch >= _height) {
307                                     _top = (ch - _height) / 2;
308                                 } else {
309                                     _top = 0;
310                                 }
311                             }
312 
313                             this.setTop(Math.round(_top));
314                             $(this.shadowDiv).css("top", this.shadowDepth);
315                             $(this.shadowDiv).css("bottom", -this.shadowDepth);
316                         }
317 
318                         this.doResizeOrMove(rf.ui.PopupPanel.Sizer.Diff.EMPTY);
319                     }
320 
321                     this.currentMinHeight = this.getMinimumSize(this.__getParsedOption(options, 'minHeight'));
322                     this.currentMinWidth = this.getMinimumSize(this.__getParsedOption(options, 'minWidth'));
323 
324                     var eContentElt = this.getContentElement();
325 
326                     if (!this.options.autosized) {
327                         if (options.width && options.width == -1)
328                             options.width = 300;
329                         if (options.height && options.height == -1)
330                             options.height = 200;
331                     }
332 
333                     this.div.css('visibility', '');
334                     if (rf.browser.msie) {
335                         $(this.cdiv).find('input').each(function() {
336                             // Force a CSS "touch" of all popupPanel children to ensure visibility in IE for RF-12850
337                             var $this = $(this);
338                             if ($this.parents(".rf-pp-cntr").first().attr('id') === element.attr('id')) {
339                                 $this.css('visibility', $this.css('visibility'));
340                             }
341                         })
342                     }
343                     this.div.css('display', 'block');
344                     if (this.options.autosized) {
345                         this.shadowDiv.css('width', this.cdiv[0].clientWidth);
346 
347                     }
348 
349                     if (options.width && options.width != -1 || options.autosized) {
350                         var width;
351                         if (options.autosized) {
352                             width = this.getStyle(this.getContentElement(), "width");
353                             if (this.currentMinWidth > width) {
354                                 width = this.currentMinWidth;
355                             }
356                             if (width > this.maxWidth) {
357                                 width = this.maxWidth;
358                             }
359                         } else {
360                             if (this.currentMinWidth > options.width) {
361                                 options.width = this.currentMinWidth;
362                             }
363                             if (options.width > this.maxWidth) {
364                                 options.width = this.maxWidth;
365                             }
366                             width = options.width;
367                         }
368                         $(rf.getDomElement(eContentElt)).css('width', width + (/px/.test(width) ? '' : 'px'));
369                         this.shadowDiv.css('width', width + (/px/.test(width) ? '' : 'px'));
370                         this.scrollerDiv.css('width', width + (/px/.test(width) ? '' : 'px'));
371                     }
372 
373                     if (options.height && options.height != -1 || options.autosized) {
374                         var height;
375                         if (options.autosized) {
376                             height = this.getStyle(this.getContentElement(), "height");
377                             if (this.currentMinHeight > height) {
378                                 height = this.currentMinHeight;
379                             }
380                             if (height > this.maxHeight) {
381                                 height = this.maxHeight;
382                             }
383                         } else {
384                             if (this.currentMinHeight > options.height) {
385                                 options.height = this.currentMinHeight;
386                             }
387                             if (options.height > this.maxHeight) {
388                                 options.height = this.maxHeight;
389                             }
390                             height = options.height;
391                         }
392                         $(rf.getDomElement(eContentElt)).css('height', height + (/px/.test(height) ? '' : 'px'));
393                         var headerHeight = $(rf.getDomElement(this.markerId + "_header")) ? $(rf.getDomElement(this.markerId + "_header")).innerHeight() : 0;
394                         this.shadowDiv.css('height', height + (/px/.test(height) ? '' : 'px'));
395                         this.scrollerDiv.css('height', height - headerHeight + (/px/.test(height) ? '' : 'px'));
396                     }
397 
398                     var eIframe;
399                     if (this.options.overlapEmbedObjects && !this.iframe) {
400                         this.iframe = this.markerId + "IFrame";
401                         $("<iframe src=\"javascript:''\" frameborder=\"0\" scrolling=\"no\" id=\"" + this.iframe + "\" " +
402                             "class=\"rf-pp-ifr\" style=\"width:" + this.options.width + "px; height:" + this.options.height + "px;\">" +
403                             "</iframe>").insertBefore($(':first-child', this.cdiv)[0]);
404 
405                         eIframe = $(rf.getDomElement(this.iframe));
406 
407                         eIframe.bind('load', this.initIframe);
408                         this.eIframe = eIframe;
409                     }
410 
411                     if (options.left) {
412                         var _left;
413                         if (options.left != "auto") {
414                             _left = parseInt(options.left, 10);
415                         } else {
416                             var cw = this.__calculateWindowWidth();
417                             var _width = this.width();
418                             if (cw >= _width) {
419                                 _left = (cw - _width) / 2;
420                             } else {
421                                 _left = 0;
422                             }
423                         }
424 
425                         this.setLeft(Math.round(_left));
426                         $(this.shadowDiv).css("left", this.shadowDepth);
427                     }
428 
429                     if (options.top) {
430                         var _top;
431                         if (options.top != "auto") {
432                             _top = parseInt(options.top, 10);
433                         } else {
434                             var ch = this.__calculateWindowHeight();
435                             var _height = this.height();
436                             if (ch >= _height) {
437                                 _top = (ch - _height) / 2;
438                             } else {
439                                 _top = 0;
440                             }
441                         }
442 
443                         this.setTop(Math.round(_top));
444                         $(this.shadowDiv).css("top", this.shadowDepth);
445                         $(this.shadowDiv).css("bottom", -this.shadowDepth);
446                     }
447 
448                     var showEvent = {};
449                     showEvent.parameters = opts || {};
450                     this.shown = true;
451                     // Cache the height difference between the shadoww div and the scroller div for later height calculations
452                     this.scrollerSizeDelta = parseInt(this.shadowDiv.css('height')) - parseInt(this.scrollerDiv.css('height'));
453                     this.invokeEvent("show", showEvent, null, element);
454                 }
455             },
456 
457             __calculateWindowHeight: function() {
458                 var documentElement = document.documentElement;
459                 return self.innerHeight || (documentElement && documentElement.clientHeight) || document.body.clientHeight;
460             },
461 
462             __calculateWindowWidth: function() {
463                 var documentElement = document.documentElement;
464                 return self.innerWidth || (documentElement && documentElement.clientWidth) || document.body.clientWidth;
465             },
466 
467             startDrag: function(border) {
468                 disableSelection(document.body);
469             },
470             firstOnfocus: function(event) {
471                 var e = $(event.data.popup.firstHref);
472                 if (e) {
473                     e.focus();
474                 }
475             },
476 
477             processAllFocusElements: function(root, callback) {
478                 var idx = -1;
479                 var tagName;
480                 var formElements = "|a|input|select|button|textarea|";
481 
482                 if (root.focus && root.nodeType == 1 && (tagName = root.tagName) &&
483                     // Many not visible elements have focus method, we is had to avoid processing them.
484                     (idx = formElements.indexOf(tagName.toLowerCase())) != -1 &&
485                     formElements.charAt(idx - 1) === '|' &&
486                     formElements.charAt(idx + tagName.length) === '|' &&
487                     !root.disabled && root.type != "hidden") {
488                     callback.call(this, root);
489                 } else {
490                     if (root != this.cdiv.get(0)) {
491                         var child = root.firstChild;
492                         while (child) {
493                             if (!child.style || child.style.display != 'none') {
494                                 this.processAllFocusElements(child, callback);
495                             }
496                             child = child.nextSibling;
497                         }
498                     }
499                 }
500             },
501 
502             processTabindexes:    function(input) {
503                 if (!this.firstOutside) {
504                     this.firstOutside = input;
505                 }
506                 if (!input.prevTabIndex) {
507                     input.prevTabIndex = input.tabIndex;
508                     input.tabIndex = -1;
509                 }
510 
511                 if (!input.prevAccessKey) {
512                     input.prevAccessKey = input.accessKey;
513                     input.accessKey = "";
514                 }
515             },
516 
517             restoreTabindexes:    function(input) {
518                 if (input.prevTabIndex != undefined) {
519                     if (input.prevTabIndex == 0) {
520                         $(input).removeAttr('tabindex');
521                     } else {
522                         input.tabIndex = input.prevTabIndex;
523                     }
524                     input.prevTabIndex = undefined;
525                 }
526                 if (input.prevAccessKey != undefined) {
527                     if (input.prevAccessKey == "") {
528                         $(input).removeAttr('accesskey');
529                     } else {
530                         input.accessKey = input.prevAccessKey;
531                     }
532                     input.prevAccessKey = undefined;
533                 }
534             },
535 
536             preventFocus:    function() {
537                 if (this.options.modal) {
538                     this.processAllFocusElements(document, this.processTabindexes);
539                     var popup = this;
540                     if (this.firstOutside) {
541 
542                         $(rf.getDomElement(this.firstOutside)).bind("focus", {popup: popup}, this.firstOnfocus);
543                     }
544                 }
545             },
546 
547             restoreFocus: function() {
548                 if (this.options.modal) {
549                     this.processAllFocusElements(document, this.restoreTabindexes);
550 
551                     if (this.firstOutside) {
552                         $(rf.getDomElement(this.firstOutside)).unbind("focus", this.firstOnfocus);
553                         this.firstOutside = null;
554                     }
555                 }
556             },
557 
558             endDrag: function(border) {
559                 for (var k = 0; k < this.borders.length; k++) {
560                     this.borders[k].show();
561                     this.borders[k].doPosition();
562                 }
563                 enableSelection(document.body);
564             },
565 
566             hide: function(event, opts) {
567                 var element = this.cdiv;
568                 this.restoreFocus();
569                 if (this.shown && this.invokeEvent("beforehide", event, null, element)) {
570 
571                     this.currentMinHeight = undefined;
572                     this.currentMinWidth = undefined;
573 
574                     this.div.hide();
575 
576                     if (this.parent) {
577                         if (this.domReattached) {
578                             this.saveInputValues(element);
579                             var div = this.div.get(0);
580                             this.shadeDiv.length && div.appendChild(this.shadeDiv.get(0));
581                             div.appendChild(element.get(0));
582 
583                             this.domReattached = false;
584                         }
585                     }
586 
587                     var hideEvent = {};
588                     hideEvent.parameters = opts || {};
589 
590                     var forms = $("form", element);
591                     if (this.options.keepVisualState && forms) {
592                         for (var i = 0; i < forms.length; i++) {
593                             $(forms[i]).unbind("submit", this.setStateInput);
594                         }
595                     }
596 
597                     this.shown = false;
598                     this.invokeEvent("hide", hideEvent, null, element);
599 
600                     // reset position for proper resizing
601                     this.setLeft(10);
602                     this.setTop(10);
603                 }
604             },
605 
606             getStyle: function(elt, name) {
607                 return parseInt($(rf.getDomElement(elt)).css(name).replace("px", ""), 10);
608             },
609 
610             resizeListener: function(event, diff) {
611                 this.doResizeOrMove(rf.ui.PopupPanel.Sizer.Diff.EMPTY);
612             },
613 
614             doResizeOrMove: function(diff) {
615                 var vetoes = {};
616                 var shadowHash = {};
617                 var cssHash = {};
618                 var cssHashWH = {};
619                 var shadowHashWH = {};
620                 var contentHashWH = {};
621                 var scrollerHashWH = {};
622                 var newSize;
623                 var scrollerHeight = this.scrollerSizeDelta;
624                 var scrollerWidth = 0;
625                 var eContentElt = this.getContentElement();
626 
627                 var doResize = diff === rf.ui.PopupPanel.Sizer.Diff.EMPTY || diff.deltaWidth || diff.deltaHeight;
628 
629                 if (doResize) {
630                     if (this.options.autosized) {
631                         this.resetWidth();
632                         this.resetHeight();
633                     }
634 
635                     newSize = this.getStyle(eContentElt, "width");
636 
637                     var oldWidthSize = newSize;
638                     newSize += diff.deltaWidth || 0;
639 
640                     if (newSize >= this.currentMinWidth) {
641                         cssHashWH.width = newSize + 'px';
642                         shadowHashWH.width = newSize + 'px';
643                         contentHashWH.width = newSize - scrollerWidth + 'px';
644                         scrollerHashWH.width = newSize - scrollerWidth + 'px';
645                     } else {
646                         cssHashWH.width = this.currentMinWidth + 'px';
647                         shadowHashWH.width = this.currentMinWidth + 'px';
648                         contentHashWH.width = this.currentMinWidth - scrollerWidth + 'px';
649                         scrollerHashWH.width = this.currentMinWidth - scrollerWidth + 'px';
650 
651                         if (diff.deltaWidth) {
652                             vetoes.vx = oldWidthSize - this.currentMinWidth;
653                             vetoes.x = true;
654                         }
655                     }
656 
657                     if (newSize > this.options.maxWidth) {
658                         cssHashWH.width = this.options.maxWidth + 'px';
659                         shadowHashWH.width = this.options.maxWidth + 'px';
660                         contentHashWH.width = this.options.maxWidth - scrollerWidth + 'px';
661                         scrollerHashWH.width = this.options.maxWidth - scrollerWidth + 'px';
662 
663                         if (diff.deltaWidth) {
664                             vetoes.vx = oldWidthSize - this.options.maxWidth;
665                             vetoes.x = true;
666                         }
667                     }
668                 }
669 
670                 if (vetoes.vx && diff.deltaX) {
671                     diff.deltaX = -vetoes.vx;
672                 }
673 
674                 var eCdiv = $(this.cdiv);
675 
676                 if (diff.deltaX && (vetoes.vx || !vetoes.x)) {
677                     if (vetoes.vx) {
678                         diff.deltaX = vetoes.vx;
679                     }
680 
681                     var newLeftPos = this.getStyle(eCdiv, "left");
682                     newLeftPos += diff.deltaX;
683                     cssHash.left = newLeftPos + 'px';
684 
685                 }
686 
687                 if (doResize) {
688                     newSize = this.getStyle(eContentElt, "height");
689 
690                     var oldHeightSize = newSize;
691                     newSize += diff.deltaHeight || 0;
692 
693                     if (newSize >= this.currentMinHeight) {
694                         cssHashWH.height = newSize + 'px';
695                         shadowHashWH.height = newSize + 'px';
696                         scrollerHashWH.height = newSize - scrollerHeight + 'px';
697                     } else {
698                         cssHashWH.height = this.currentMinHeight + 'px';
699                         shadowHashWH.height = this.currentMinHeight + 'px';
700                         scrollerHashWH.height = this.currentMinHeight - scrollerHeight + 'px';
701 
702                         if (diff.deltaHeight) {
703                             vetoes.vy = oldHeightSize - this.currentMinHeight;
704                             vetoes.y = true;
705                         }
706                     }
707 
708                     if (newSize > this.options.maxHeight) {
709                         cssHashWH.height = this.options.maxHeight + 'px';
710                         shadowHashWH.height = this.options.maxHeight + 'px';
711                         scrollerHashWH.height = this.options.maxHeight - scrollerHeight + 'px';
712 
713                         if (diff.deltaHeight) {
714                             vetoes.vy = oldHeightSize - this.options.maxHeight;
715                             vetoes.y = true;
716                         }
717                     }
718                 }
719 
720                 if (vetoes.vy && diff.deltaY) {
721                     diff.deltaY = -vetoes.vy;
722                 }
723 
724                 if (diff.deltaY && (vetoes.vy || !vetoes.y)) {
725                     if (vetoes.vy) {
726                         diff.deltaY = vetoes.vy;
727                     }
728 
729                     var newTopPos = this.getStyle(eCdiv, "top");
730                     newTopPos += diff.deltaY;
731                     cssHash.top = newTopPos + 'px';
732                 }
733 
734                 eContentElt.css(cssHashWH);
735                 this.scrollerDiv.css(scrollerHashWH);
736                 if (this.eIframe) {
737                     this.eIframe.css(scrollerHashWH);
738                 }
739                 this.shadowDiv.css(shadowHashWH);
740 
741                 eCdiv.css(cssHash);
742                 this.shadowDiv.css(shadowHash);
743 
744                 $.extend(this.userOptions, cssHash);
745                 $.extend(this.userOptions, cssHashWH);
746                 var w = this.width();
747                 var h = this.height();
748 
749                 this.reductionData = null;
750 
751                 if (w <= 2 * this.getInitialSize()) {
752                     this.reductionData = {};
753                     this.reductionData.w = w;
754                 }
755 
756                 if (h <= 2 * this.getInitialSize()) {
757                     if (!this.reductionData) {
758                         this.reductionData = {};
759                     }
760 
761                     this.reductionData.h = h;
762                 }
763 
764                 if (this.header) {
765                     this.header.doPosition();
766                 }
767 
768                 return vetoes;
769             },
770 
771             resetWidth: function() {
772                 this.getContentElement().css('width', '');
773                 this.scrollerDiv.css('width', '');
774                 if (this.eIframe) {
775                     this.eIframe.css('width', '');
776                 }
777                 this.shadowDiv.css('width', '');
778                 $(this.cdiv).css('width', '');
779             },
780 
781             resetHeight: function() {
782                 this.getContentElement().css('height', '');
783                 this.scrollerDiv.css('height', '');
784                 if (this.eIframe) {
785                     this.eIframe.css('height', '');
786                 }
787                 this.shadowDiv.css('height', '');
788                 $(this.cdiv).css('height', '');
789             },
790 
791             setSize : function (width, height) {
792                 var w = width - this.width();
793                 var h = height - this.height();
794                 var diff = new rf.ui.PopupPanel.Sizer.Diff(0, 0, w, h);
795                 this.doResizeOrMove(diff);
796             },
797 
798             moveTo : function (top, left) {
799                 this.cdiv.css('top', top);
800                 this.cdiv.css('left', left);
801             },
802 
803             move : function (dx, dy) {
804                 var diff = new rf.ui.PopupPanel.Sizer.Diff(dx, dy, 0, 0);
805                 this.doResizeOrMove(diff);
806             },
807 
808             resize : function (dx, dy) {
809                 var diff = new rf.ui.PopupPanel.Sizer.Diff(0, 0, dx, dy);
810                 this.doResizeOrMove(diff);
811             },
812 
813             findForm: function(elt) {
814                 var target = elt;
815                 while (target) {
816                     if (target[0] && (!target[0].tagName /* document node doesn't have tagName */
817                         || target[0].tagName.toLowerCase() != "form")) {
818 
819                         target = $(target).parent();
820                     } else {
821                         break;
822                     }
823                 }
824 
825                 return target;
826             },
827 
828             setStateInput: function(event) {
829                 // Concret input but not entire form is a target element for onsubmit in FF
830                 var popup = event.data.popup;
831                 target = $(popup.findForm(event.currentTarget));
832 
833                 var input = document.createElement("input");
834                 input.type = "hidden";
835                 input.id = popup.markerId + "OpenedState";
836                 input.name = popup.markerId + "OpenedState";
837                 input.value = popup.shown ? "true" : "false";
838                 target.append(input);
839 
840                 $.each(popup.userOptions, function(key, value) {
841                     input = document.createElement("input");
842                     input.type = "hidden";
843                     input.id = popup.markerId + "StateOption_" + key;
844                     input.name = popup.markerId + "StateOption_" + key;
845                     input.value = value;
846                     target.append(input);
847                 });
848 
849                 return true;
850             }
851 
852 
853         }
854 
855     })());
856     $.extend(rf.ui.PopupPanel, {
857 
858             showPopupPanel : function (id, opts, event) {
859                 rf.Event.ready(function() {
860                     rf.component(id).show()
861                 });
862             },
863 
864             hidePopupPanel : function (id, opts, event) {
865                 rf.Event.ready(function() {
866                     rf.component(id).hide()
867                 });
868             }
869         });
870 
871 })(RichFaces.jQuery, window.RichFaces);
872