/** * @filename : editor_plugin.js * @description : jQuery UI Inline Popups plugin to replace the default inlinepopups * @developer : badsyntax (Richard Willis) * @contact : http://badsyntax.co * @moreinfo : http://is.gd/j1FuI */ (function() { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; // Create the editor plugin tinymce.create('tinymce.plugins.jQueryInlinePopups', { init : function(ed, url) { // Replace window manager ed.onBeforeRenderUI.add(function() { ed.windowManager = new tinymce.InlineWindowManager(ed); }); }, getInfo : function() { return { longname : 'jQuery UI Inline Popups', author : 'Richard Willis', authorurl : 'http://badsyntax.co', infourl : 'http://is.gd/j1FuI', version : '0.1b' }; } }); // Create the window manager tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { InlineWindowManager : function(ed) { this.parent(ed); this.windows = {}; }, open : function(f, p) { console.log(f); f = f || {}; p = p || {}; // Run native windows if (!f.inline) { return t.parent(f, p); } var t = this, id = DOM.uniqueId(), // Dialog config config = { title: f.title || '', width: 'auto', height: 'auto', modal: true, resizable: false, draggable: true, dialogClass: 'ui-dialog-tinymce', // match the tinymce inlinepopups starting z-index (fixes #3) zIndex: 300000 }, // Dialog element dialog = $('
') .attr('id', 'dialog-' + id) .hide() .appendTo('body'), // Window info w = { id : id, features : f, element: dialog }; // Only store selection if the type is a normal window. // This is required at least for IE to remeber the position // before the focus from editor is lost. if (!f.type) { this.bookmark = this.editor.selection.getBookmark(1); } // Inline content if (f.content){ if (f.type == 'confirm'){ config.buttons = [{ 'text': 'Ok', 'click': function(e){ f.button_func(true); } }, { 'text': 'Cancel', 'click': function(e){ f.button_func(false); } }]; } else if (f.type == 'alert'){ config.buttons = [{ 'text': 'Ok', 'click': function(e){ f.button_func(true); } }]; } config.width = f.width; dialog.html($('', { 'class': 'ui-dialog-tinymce-content', 'html': f.content })); } // iFramed document else { console.log(f); var iframe = $('', { id: id + '_ifr', frameborder: 0 }) .css({ width: f.width, height: f.height }) .appendTo(dialog); } p.mce_inline = true; p.mce_window_id = id; p.mce_auto_focus = f.auto_focus; this.features = f; this.params = p; this.onOpen.dispatch(this, f, p); dialog.dialog(config); // Load in iframe src if (!f.content) { iframe.attr( 'src', f.url || f.file ); iframe.load(function() { var iframeDom = $(iframe).contents(); // build the buttonpane of the dialog ui, that way we don't have to rewrite tinyMCE base plugins buttonPane = $('').addClass('ui-dialog-buttonpane ui-widget-content ui-helper-clearfix'); dialog.after(buttonPane); buttons = $('').addClass('button-wrapper').appendTo(buttonPane); iframeDom.find('.mceActionPanel').hide().find('input[type=button], input[type=submit]').each(function() { var button = $(this); var link; if (button.attr('id') == 'cancel') { link = $('').attr('href', '#').attr('id', 'close-link').html(button.val()); buttonPane.append(link); } else { link = $('').attr('href', '#').addClass('button').html(button.val()); buttons.append(link); } link.bind('click', function(e) { e.stopPropagation(); e.preventDefault(); button.trigger('click'); }); }); }); } // Add window t.windows[id] = w; return w; }, resizeBy : function(dw, dh, id) { return; }, focus : function(id) { return; }, close : function(win, id) { var t = this, w, id = id || win.frameElement.id.replace(/_ifr$/, ''); // Probably not inline if (!t.windows[id]) { t.parent(win); return; } if (w = t.windows[id]) { w.element.dialog('destroy').remove(); delete t.windows[id]; } }, setTitle : function(w, ti) { var id = w.frameElement.id.replace(/_ifr$/, ''); $('#ui-dialog-title-dialog-' + id).html(ti); }, alert : function(txt, cb, s) { this._messagePopup('alert', 'Alert', txt, cb, s); }, confirm : function(txt, cb, s) { this._messagePopup('confirm', 'Confirm', txt, cb, s); }, _messagePopup : function(type, title, txt, cb, s) { var t = this, w; w = t.open({ title : title, type : type, button_func : function(s) { (cb) && cb.call(s || t, s); t.close(null, w.id); }, content : DOM.encode(t.editor.getLang(txt, txt)), inline : 1, width : 400, height : 130 }); } }); // Register plugin tinymce.PluginManager.add('jqueryinlinepopups', tinymce.plugins.jQueryInlinePopups); })();