Mercurial > hg > rr-repo
diff sites/all/modules/wysiwyg/editors/js/fckeditor-2.6.js @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/wysiwyg/editors/js/fckeditor-2.6.js Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,196 @@ +(function($) { + +/** + * Attach this editor to a target element. + */ +Drupal.wysiwyg.editor.attach.fckeditor = function(context, params, settings) { + var FCKinstance = new FCKeditor(params.field, settings.Width, settings.Height, settings.ToolbarSet); + // Apply editor instance settings. + FCKinstance.BasePath = settings.EditorPath; + FCKinstance.Config.wysiwygFormat = params.format; + FCKinstance.Config.CustomConfigurationsPath = settings.CustomConfigurationsPath; + + // Load Drupal plugins and apply format specific settings. + // @see fckeditor.config.js + // @see Drupal.wysiwyg.editor.instance.fckeditor.init() + + // Attach editor. + FCKinstance.ReplaceTextarea(); +}; + +/** + * Detach a single or all editors. + */ +Drupal.wysiwyg.editor.detach.fckeditor = function (context, params, trigger) { + var instances = []; + if (typeof params != 'undefined' && typeof FCKeditorAPI != 'undefined') { + var instance = FCKeditorAPI.GetInstance(params.field); + if (instance) { + instances[params.field] = instance; + } + } + else { + instances = FCKeditorAPI.__Instances; + } + + for (var instanceName in instances) { + var instance = instances[instanceName]; + instance.UpdateLinkedField(); + if (trigger == 'serialize') { + // The editor is not being removed from the DOM, so updating the linked + // field is the only action necessary. + continue; + } + // Since we already detach the editor and update the textarea, the submit + // event handler needs to be removed to prevent data loss (in IE). + // FCKeditor uses 2 nested iFrames; instance.EditingArea.Window is the + // deepest. Its parent is the iFrame containing the editor. + var instanceScope = instance.EditingArea.Window.parent; + instanceScope.FCKTools.RemoveEventListener(instance.GetParentForm(), 'submit', instance.UpdateLinkedField); + // Run cleanups before forcing an unload of the iFrames or IE crashes. + // This also deletes the instance from the FCKeditorAPI.__Instances array. + instanceScope.FCKTools.RemoveEventListener(instanceScope, 'unload', instanceScope.FCKeditorAPI_Cleanup); + instanceScope.FCKTools.RemoveEventListener(instanceScope, 'beforeunload', instanceScope.FCKeditorAPI_ConfirmCleanup); + if (jQuery.isFunction(instanceScope.FCKIECleanup_Cleanup)) { + instanceScope.FCKIECleanup_Cleanup(); + } + instanceScope.FCKeditorAPI_ConfirmCleanup(); + instanceScope.FCKeditorAPI_Cleanup(); + // Remove the editor elements. + $('#' + instanceName + '___Config').remove(); + $('#' + instanceName + '___Frame').remove(); + $('#' + instanceName).show(); + } +}; + +Drupal.wysiwyg.editor.instance.fckeditor = { + init: function(instance) { + // Track which editor instance is active. + instance.FCK.Events.AttachEvent('OnFocus', function(editorInstance) { + Drupal.wysiwyg.activeId = editorInstance.Name; + }); + + // Create a custom data processor to wrap the default one and allow Drupal + // plugins modify the editor contents. + var wysiwygDataProcessor = function() {}; + wysiwygDataProcessor.prototype = new instance.FCKDataProcessor(); + // Attach: Convert text into HTML. + wysiwygDataProcessor.prototype.ConvertToHtml = function(data) { + // Called from SetData() with stripped comments/scripts, revert those + // manipulations and attach Drupal plugins. + var data = instance.FCKConfig.ProtectedSource.Revert(data); + if (Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat] && Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal) { + for (var plugin in Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal) { + if (typeof Drupal.wysiwyg.plugins[plugin].attach == 'function') { + data = Drupal.wysiwyg.plugins[plugin].attach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], instance.FCK.Name); + data = Drupal.wysiwyg.editor.instance.fckeditor.prepareContent(data); + } + } + } + // Re-protect the source and use the original data processor to convert it + // into XHTML. + data = instance.FCKConfig.ProtectedSource.Protect(data); + return instance.FCKDataProcessor.prototype.ConvertToHtml.call(this, data); + }; + // Detach: Convert HTML into text. + wysiwygDataProcessor.prototype.ConvertToDataFormat = function(rootNode, excludeRoot, ignoreIfEmptyParagraph, format) { + // Called from GetData(), convert the content's DOM into a XHTML string + // using the original data processor and detach Drupal plugins. + var data = instance.FCKDataProcessor.prototype.ConvertToDataFormat.call(this, rootNode, excludeRoot, ignoreIfEmptyParagraph, format); + if (Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat] && Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal) { + for (var plugin in Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal) { + if (typeof Drupal.wysiwyg.plugins[plugin].detach == 'function') { + data = Drupal.wysiwyg.plugins[plugin].detach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], instance.FCK.Name); + } + } + } + return data; + }; + instance.FCK.DataProcessor = new wysiwygDataProcessor(); + }, + + addPlugin: function(plugin, settings, pluginSettings, instance) { + if (typeof Drupal.wysiwyg.plugins[plugin] != 'object') { + return; + } + + if (Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal[plugin].css) { + instance.FCKConfig.EditorAreaCSS += ',' + Drupal.settings.wysiwyg.plugins[instance.wysiwygFormat].drupal[plugin].css; + } + + // @see fckcommands.js, fck_othercommands.js, fckpastewordcommand.js + instance.FCKCommands.RegisterCommand(plugin, { + // Invoke the plugin's button. + Execute: function () { + if (typeof Drupal.wysiwyg.plugins[plugin].invoke == 'function') { + var data = { format: 'html', node: instance.FCKSelection.GetParentElement() }; + // @todo This is NOT the same as data.node. + data.content = data.node.innerHTML; + Drupal.wysiwyg.plugins[plugin].invoke(data, pluginSettings, instance.FCK.Name); + } + }, + + // isNode: Return whether the plugin button should be enabled for the + // current selection. + // @see FCKUnlinkCommand.prototype.GetState() + GetState: function () { + // Always disabled if not in WYSIWYG mode. + if (instance.FCK.EditMode != FCK_EDITMODE_WYSIWYG) { + return FCK_TRISTATE_DISABLED; + } + var state = instance.FCK.GetNamedCommandState(this.Name); + // FCKeditor sets the wrong state in WebKit browsers. + if (!$.support.queryCommandEnabled && state == FCK_TRISTATE_DISABLED) { + state = FCK_TRISTATE_OFF; + } + if (state == FCK_TRISTATE_OFF && instance.FCK.EditMode == FCK_EDITMODE_WYSIWYG) { + if (typeof Drupal.wysiwyg.plugins[plugin].isNode == 'function') { + var node = instance.FCKSelection.GetSelectedElement(); + state = Drupal.wysiwyg.plugins[plugin].isNode(node) ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF; + } + } + return state; + }, + + /** + * Return information about the plugin as a name/value array. + */ + Name: plugin + }); + + // Register the plugin button. + // Arguments: commandName, label, tooltip, style, sourceView, contextSensitive, icon. + instance.FCKToolbarItems.RegisterItem(plugin, new instance.FCKToolbarButton(plugin, settings.iconTitle, settings.iconTitle, null, false, true, settings.icon)); + }, + + openDialog: function(dialog, params) { + // @todo Implement open dialog. + }, + + closeDialog: function(dialog) { + // @todo Implement close dialog. + }, + + prepareContent: function(content) { + // @todo Not needed for FCKeditor? + return content; + }, + + insert: function(content) { + var instance = FCKeditorAPI.GetInstance(this.field); + // @see FCK.InsertHtml(), FCK.InsertElement() + instance.InsertHtml(content); + }, + + getContent: function () { + var instance = FCKeditorAPI.GetInstance(this.field); + return instance.GetData(); + }, + + setContent: function (content) { + var instance = FCKeditorAPI.GetInstance(this.field); + instance.SetHTML(content); + } +}; + +})(jQuery);