240 lines
5.9 KiB
JavaScript
240 lines
5.9 KiB
JavaScript
/**
|
|
* @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 = $('<div />')
|
|
.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($('<div />', {
|
|
'class': 'ui-dialog-tinymce-content',
|
|
'html': f.content
|
|
}));
|
|
}
|
|
// iFramed document
|
|
else
|
|
{
|
|
console.log(f);
|
|
var iframe = $('<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 = $('<div></div>').addClass('ui-dialog-buttonpane ui-widget-content ui-helper-clearfix');
|
|
dialog.after(buttonPane);
|
|
buttons = $('<div></div>').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 = $('<a></a>').attr('href', '#').attr('id', 'close-link').html(button.val());
|
|
buttonPane.append(link);
|
|
} else {
|
|
link = $('<a></a>').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);
|
|
})(); |