/* * jQuery UI Dialog * * Copyright (c) 2008 Richard D. Worth (rdworth.org) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Dialog * * Depends: * ui.core.js * ui.draggable.js * ui.resizable.js * * Changes by Jackson Caset - www.profissionaisti.com.br * -> Line 122/148: allow to maximize dialog (on the maximize icon and with doubleclick on titlebar) - maximize:true/false (true is default) * -> Line 61/476: allow to remove the close icon and not allow to close with ESC if closable is false - closable:true/false (true is default) * -> Line 175: not allow to drag the dialog outside the document or a specific element - containment:element (document is default) * -> Line 300: major precision on the content size and scroll (is necessary more tests with diferent themas) * -> Line 344 - 365: functions maximize, restore and adjust content on dialog * -> Line 428: new options closable and maximize */ (function($) { var setDataSwitch = { dragStart: "start.draggable", drag: "drag.draggable", dragStop: "stop.draggable", maxHeight: "maxHeight.resizable", minHeight: "minHeight.resizable", maxWidth: "maxWidth.resizable", minWidth: "minWidth.resizable", resizeStart: "start.resizable", resize: "drag.resizable", resizeStop: "stop.resizable" }; $.widget("ui.dialog", { maximized : false, init: function() { var self = this, options = this.options, resizeHandles = typeof options.resizable == 'string' ? options.resizable : 'n,e,s,w,se,sw,ne,nw', uiDialogContent = this.element .addClass('ui-dialog-content') .wrap('
') .wrap('
'), uiDialogContainer = (this.uiDialogContainer = uiDialogContent.parent() .addClass('ui-dialog-container') .css({position: 'relative', width: '100%', height: '100%'})), title = options.title || uiDialogContent.attr('title') || '', uiDialogTitlebar = (this.uiDialogTitlebar = $('
')) .append('' + title + ''); /* Verifify if the dialog is closable by the close button. | by Jackson Caset - www.profissionaisti.com.br */ if(this.options.closable) { uiDialogTitlebar.append('X'); } /* ******************************************************************************************************* */ uiDialogTitlebar.prependTo(uiDialogContainer), uiDialog = (this.uiDialog = uiDialogContainer.parent()) .appendTo(document.body) .hide() .addClass('ui-dialog') .addClass(options.dialogClass) // add content classes to dialog // to inherit theme at top level of element .addClass(uiDialogContent.attr('className')) .removeClass('ui-dialog-content') .css({ position: 'absolute', width: options.width, height: options.height, overflow: 'hidden', zIndex: options.zIndex }) // setting tabIndex makes the div focusable // setting outline to 0 prevents a border on focus in Mozilla .attr('tabIndex', -1).css('outline', 0).keydown(function(ev) { if (options.closeOnEscape && options.closable) { var ESC = 27; (ev.keyCode && ev.keyCode == ESC && self.close()); } }) .mousedown(function() { self.moveToTop(); }), uiDialogButtonPane = (this.uiDialogButtonPane = $('
')) .addClass('ui-dialog-buttonpane').css({ position: 'absolute', bottom: 5 /* Adjust the button. Default is 0 */ }) .appendTo(uiDialog); this.uiDialogTitlebarClose = $('.ui-dialog-titlebar-close', uiDialogTitlebar) .hover( function() { $(this).addClass('ui-dialog-titlebar-close-hover'); }, function() { $(this).removeClass('ui-dialog-titlebar-close-hover'); } ) .mousedown(function(ev) { ev.stopPropagation(); }) .click(function() { self.close(); return false; }); this.uiDialogTitlebar.find("*").add(this.uiDialogTitlebar).each(function() { $.ui.disableSelection(this); }); /* Verifify if the dialog is maximizable. | by Jackson Caset - www.profissionaisti.com.br */ if (options.maximize) { uiDialogTitlebar.append('Min'); this.uiDialogTitlebarMin = $('#dialog-restore', uiDialogTitlebar).hover(function(){ $(this).addClass('ui-dialog-titlebar-rest-hover'); }, function(){ $(this).removeClass('ui-dialog-titlebar-rest-hover'); }).mousedown(function(ev){ ev.stopPropagation(); }).click(function(){ self.restore(); return false; }).hide(); uiDialogTitlebar.append('Max'); this.uiDialogTitlebarMax = $('#dialog-maximize', uiDialogTitlebar).hover(function(){ $(this).addClass('ui-dialog-titlebar-max-hover'); }, function(){ $(this).removeClass('ui-dialog-titlebar-max-hover'); }).mousedown(function(ev){ ev.stopPropagation(); }).click(function(){ self.maximize(); return false; }); /* Allow titlebar doubleclick to maximize/restore the dialog. | by Jackson Caset - www.profissionaisti.com.br */ uiDialogTitlebar.bind("dblclick", function() { if(self.maximized) { self.restore(); } else { self.maximize(); } }); } /* ********************************************************************************************* */ if ($.fn.draggable) { uiDialog.draggable({ cancel: '.ui-dialog-content', helper: options.dragHelper, handle: '.ui-dialog-titlebar', start: function(e, ui) { self.moveToTop(); (options.dragStart && options.dragStart.apply(self.element[0], arguments)); }, drag: function(e, ui) { (options.drag && options.drag.apply(self.element[0], arguments)); }, stop: function(e, ui) { (options.dragStop && options.dragStop.apply(self.element[0], arguments)); $.ui.dialog.overlay.resize(); }, /* Containment the dialog. By default the document is the container. | by Jackson Caset - www.profissionaisti.com.br */ containment: options.containment || 'document' }); (options.draggable || uiDialog.draggable('disable')); } if ($.fn.resizable) { uiDialog.resizable({ cancel: '.ui-dialog-content', helper: options.resizeHelper, maxWidth: options.maxWidth, maxHeight: options.maxHeight, minWidth: options.minWidth, minHeight: options.minHeight, start: function() { (options.resizeStart && options.resizeStart.apply(self.element[0], arguments)); }, resize: function(e, ui) { (options.autoResize && self.size.apply(self)); (options.resize && options.resize.apply(self.element[0], arguments)); }, handles: resizeHandles, stop: function(e, ui) { (options.autoResize && self.size.apply(self)); (options.resizeStop && options.resizeStop.apply(self.element[0], arguments)); $.ui.dialog.overlay.resize(); } }); (options.resizable || uiDialog.resizable('disable')); } this.createButtons(options.buttons); this.isOpen = false; (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe()); (options.autoOpen && this.open()); }, setData: function(key, value){ (setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value)); switch (key) { case "buttons": this.createButtons(value); break; case "draggable": this.uiDialog.draggable(value ? 'enable' : 'disable'); break; case "height": this.uiDialog.height(value); break; case "position": this.position(value); break; case "resizable": (typeof value == 'string' && this.uiDialog.data('handles.resizable', value)); this.uiDialog.resizable(value ? 'enable' : 'disable'); break; case "title": $(".ui-dialog-title", this.uiDialogTitlebar).text(value); break; case "width": this.uiDialog.width(value); break; } $.widget.prototype.setData.apply(this, arguments); }, position: function(pos) { var wnd = $(window), doc = $(document), pTop = doc.scrollTop(), pLeft = doc.scrollLeft(), minTop = pTop; if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) { pos = [ pos == 'right' || pos == 'left' ? pos : 'center', pos == 'top' || pos == 'bottom' ? pos : 'middle' ]; } if (pos.constructor != Array) { pos = ['center', 'middle']; } if (pos[0].constructor == Number) { pLeft += pos[0]; } else { switch (pos[0]) { case 'left': pLeft += 0; break; case 'right': pLeft += wnd.width() - this.uiDialog.width(); break; default: case 'center': pLeft += (wnd.width() - this.uiDialog.width()) / 2; } } if (pos[1].constructor == Number) { pTop += pos[1]; } else { switch (pos[1]) { case 'top': pTop += 0; break; case 'bottom': pTop += wnd.height() - this.uiDialog.height(); break; default: case 'middle': pTop += (wnd.height() - this.uiDialog.height()) / 2; } } // prevent the dialog from being too high (make sure the titlebar // is accessible) pTop = Math.max(pTop, minTop); this.uiDialog.css({top: pTop, left: pLeft}); }, size: function() { var container = this.uiDialogContainer, titlebar = this.uiDialogTitlebar, content = this.element, tbMargin = parseInt(content.css('margin-top'),10) + parseInt(content.css('margin-bottom'),10), lrMargin = parseInt(content.css('margin-left'),10) + parseInt(content.css('margin-right'),10); content.height(container.height() - titlebar.outerHeight() - tbMargin /* More precision on scroll content | by Jackson Caset -> */ - 8); content.width(container.width() - lrMargin); }, open: function() { if (this.isOpen) { return; } this.overlay = this.options.modal ? new $.ui.dialog.overlay(this) : null; (this.uiDialog.next().length > 0) && this.uiDialog.appendTo('body'); this.position(this.options.position); this.uiDialog.show(this.options.show); this.options.autoResize && this.size(); this.moveToTop(true); // CALLBACK: open var openEV = null; var openUI = { options: this.options }; this.uiDialogTitlebarClose.focus(); this.element.triggerHandler("dialogopen", [openEV, openUI], this.options.open); this.isOpen = true; }, // the force parameter allows us to move modal dialogs to their correct // position on open moveToTop: function(force) { if ((this.options.modal && !force) || (!this.options.stack && !this.options.modal)) { return this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); } var maxZ = this.options.zIndex, options = this.options; $('.ui-dialog:visible').each(function() { maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10) || options.zIndex); }); (this.overlay && this.overlay.$el.css('z-index', ++maxZ)); this.uiDialog.css('z-index', ++maxZ); this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); }, /* Adjuste the content inside the dialog on maximize/restore | by Jackson Caset - www.profissionaisti.com.br */ adjustScrollContent: function () { $('.ui-dialog-content').css('width', this.uiDialog.width()-16, 'height', this.uiDialog.height()-16); }, /* Allow maximize/restore the dialog | by Jackson Caset - www.profissionaisti.com.br */ restore: function() { this.maximized=false; /* save the current state: restored */ this.uiDialog.css({width: this.options.width, height:this.options.height}); this.size(); this.adjustScrollContent(); this.position(this.options.position); $('#dialog-maximize').show(); $('#dialog-restore').hide(); }, maximize: function() { this.maximized=true; /* save the current state: maximized */ this.uiDialog.css({left:0, top:0, width: $(window.body).width(), height:$(window).height()}); this.size(); this.adjustScrollContent(); $('#dialog-restore').show(); $('#dialog-maximize').hide(); }, /* ********************************************************************************************* */ close: function() { (this.overlay && this.overlay.destroy()); this.uiDialog.hide(this.options.hide); // CALLBACK: close var closeEV = null; var closeUI = { options: this.options }; this.element.triggerHandler("dialogclose", [closeEV, closeUI], this.options.close); $.ui.dialog.overlay.resize(); ResetaBotao(); this.isOpen = false; }, destroy: function() { (this.overlay && this.overlay.destroy()); this.uiDialog.hide(); this.element .unbind('.dialog') .removeData('dialog') .removeClass('ui-dialog-content') .hide().appendTo('body'); this.uiDialog.remove(); }, createButtons: function(buttons) { var self = this, hasButtons = false, uiDialogButtonPane = this.uiDialogButtonPane; // remove any existing buttons uiDialogButtonPane.empty().hide(); $.each(buttons, function() { return !(hasButtons = true); }); if (hasButtons) { uiDialogButtonPane.show(); $.each(buttons, function(name, fn) { $('