/** * Extend the RegExp object with an escaping function * From http://simonwillison.net/2006/Jan/20/escape/ */ RegExp.escape = function( s ) { return s.replace(/([.*+?^${}()|\/\\[\]])/g, '\\$1'); }; /** * Dialog Module for wikiEditor */ ( function( $ ) { $.wikiEditor.modules.dialogs = { /** * Compatability map */ 'browsers': { // Left-to-right languages 'ltr': { 'msie': [['>=', 7]], // jQuery UI appears to be broken in FF 2.0 - 2.0.0.4 'firefox': [ ['>=', 2], ['!=', '2.0'], ['!=', '2.0.0.1'], ['!=', '2.0.0.2'], ['!=', '2.0.0.3'], ['!=', '2.0.0.4'] ], 'opera': [['>=', 9.6]], 'safari': [['>=', 3]], 'chrome': [['>=', 3]] }, // Right-to-left languages 'rtl': { 'msie': [['>=', 7]], // jQuery UI appears to be broken in FF 2.0 - 2.0.0.4 'firefox': [ ['>=', 2], ['!=', '2.0'], ['!=', '2.0.0.1'], ['!=', '2.0.0.2'], ['!=', '2.0.0.3'], ['!=', '2.0.0.4'] ], 'opera': [['>=', 9.6]], 'safari': [['>=', 3]], 'chrome': [['>=', 3]] } }, /** * API accessible functions */ api: { addDialog: function( context, data ) { $.wikiEditor.modules.dialogs.fn.create( context, data ) }, openDialog: function( context, module ) { if ( module in $.wikiEditor.modules.dialogs.modules ) { var mod = $.wikiEditor.modules.dialogs.modules[module]; var $dialog = $( '#' + mod.id ); if ( $dialog.length == 0 ) { $.wikiEditor.modules.dialogs.fn.reallyCreate( context, mod ); $dialog = $( '#' + mod.id ); } // Workaround for bug in jQuery UI: close button in top right retains focus $dialog.closest( '.ui-dialog' ) .find( '.ui-dialog-titlebar-close' ) .removeClass( 'ui-state-focus' ); $dialog.dialog( 'open' ); } }, closeDialog: function( context, module ) { if ( module in $.wikiEditor.modules.dialogs.modules ) { $( '#' + $.wikiEditor.modules.dialogs.modules[module].id ).dialog( 'close' ); } } }, /** * Internally used functions */ fn: { /** * Creates a dialog module within a wikiEditor * * @param {Object} context Context object of editor to create module in * @param {Object} config Configuration object to create module from */ create: function( context, config ) { // Defer building of modules, but do check whether they need the iframe rightaway for ( mod in config ) { var module = config[mod]; // Only create the dialog if it's supported, isn't filtered and doesn't exist yet var filtered = false; if ( typeof module.filters != 'undefined' ) { for ( var i = 0; i < module.filters.length; i++ ) { if ( $( module.filters[i] ).length == 0 ) { filtered = true; break; } } } if ( !filtered && $.wikiEditor.isSupported( module ) && $( '#' + module.id ).size() == 0 ) { $.wikiEditor.modules.dialogs.modules[mod] = module; // If this dialog requires the iframe, set it up if ( typeof context.$iframe == 'undefined' && $.wikiEditor.isRequired( module, 'iframe' ) ) { context.fn.setupIframe(); } context.$textarea.trigger( 'wikiEditor-dialogs-setup-' + mod ); } } }, /** * Build the actual dialog. This done on-demand rather than in create() * @param {Object} context Context object of editor dialog belongs to * @param {Object} module Dialog module object */ reallyCreate: function( context, module ) { var configuration = module.dialog; // Add some stuff to configuration configuration.bgiframe = true; configuration.autoOpen = false; configuration.modal = true; configuration.title = $.wikiEditor.autoMsg( module, 'title' ); // Transform messages in keys // Stupid JS won't let us do stuff like // foo = { mediaWiki.msg.get( 'bar' ): baz } configuration.newButtons = {}; for ( msg in configuration.buttons ) configuration.newButtons[mediaWiki.msg.get( msg )] = configuration.buttons[msg]; configuration.buttons = configuration.newButtons; // Create the dialog