From fd0b26af453fedf4528eaf4114914a6e5b7bc685 Mon Sep 17 00:00:00 2001 From: patdenice Date: Thu, 25 Sep 2008 15:10:39 +0000 Subject: - Add all jQuery UI files (for future use) in stable version (1.5.2). - Use jQuery cluetip plugin for new plugins page. - Remove old CSS tooltip rules. git-svn-id: http://piwigo.org/svn/trunk@2587 68402e56-0260-453c-a942-63ccdbb3a9ee --- template-common/lib/ui/ui.dialog.js | 497 ++++++++++++++++++++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 template-common/lib/ui/ui.dialog.js (limited to 'template-common/lib/ui/ui.dialog.js') diff --git a/template-common/lib/ui/ui.dialog.js b/template-common/lib/ui/ui.dialog.js new file mode 100644 index 000000000..858e9e28b --- /dev/null +++ b/template-common/lib/ui/ui.dialog.js @@ -0,0 +1,497 @@ +/* + * 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 + */ +(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", { + 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 + '') + .append('X') + .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) { + 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: 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); + }); + + 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(); + } + }); + (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); + 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); + }, + + 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(); + + 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) { + $('