annotate sites/all/modules/wysiwyg/wysiwyg.js @ 9:830c812b520f

added smtp module
author root <root@paio.local>
date Mon, 28 Oct 2013 15:34:27 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 (function($) {
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * Initialize editor libraries.
danielebarchiesi@0 5 *
danielebarchiesi@0 6 * Some editors need to be initialized before the DOM is fully loaded. The
danielebarchiesi@0 7 * init hook gives them a chance to do so.
danielebarchiesi@0 8 */
danielebarchiesi@0 9 Drupal.wysiwygInit = function() {
danielebarchiesi@0 10 // This breaks in Konqueror. Prevent it from running.
danielebarchiesi@0 11 if (/KDE/.test(navigator.vendor)) {
danielebarchiesi@0 12 return;
danielebarchiesi@0 13 }
danielebarchiesi@0 14 jQuery.each(Drupal.wysiwyg.editor.init, function(editor) {
danielebarchiesi@0 15 // Clone, so original settings are not overwritten.
danielebarchiesi@0 16 this(jQuery.extend(true, {}, Drupal.settings.wysiwyg.configs[editor]));
danielebarchiesi@0 17 });
danielebarchiesi@0 18 };
danielebarchiesi@0 19
danielebarchiesi@0 20 /**
danielebarchiesi@0 21 * Attach editors to input formats and target elements (f.e. textareas).
danielebarchiesi@0 22 *
danielebarchiesi@0 23 * This behavior searches for input format selectors and formatting guidelines
danielebarchiesi@0 24 * that have been preprocessed by Wysiwyg API. All CSS classes of those elements
danielebarchiesi@0 25 * with the prefix 'wysiwyg-' are parsed into input format parameters, defining
danielebarchiesi@0 26 * the input format, configured editor, target element id, and variable other
danielebarchiesi@0 27 * properties, which are passed to the attach/detach hooks of the corresponding
danielebarchiesi@0 28 * editor.
danielebarchiesi@0 29 *
danielebarchiesi@0 30 * Furthermore, an "enable/disable rich-text" toggle link is added after the
danielebarchiesi@0 31 * target element to allow users to alter its contents in plain text.
danielebarchiesi@0 32 *
danielebarchiesi@0 33 * This is executed once, while editor attach/detach hooks can be invoked
danielebarchiesi@0 34 * multiple times.
danielebarchiesi@0 35 *
danielebarchiesi@0 36 * @param context
danielebarchiesi@0 37 * A DOM element, supplied by Drupal.attachBehaviors().
danielebarchiesi@0 38 */
danielebarchiesi@0 39 Drupal.behaviors.attachWysiwyg = {
danielebarchiesi@0 40 attach: function (context, settings) {
danielebarchiesi@0 41 // This breaks in Konqueror. Prevent it from running.
danielebarchiesi@0 42 if (/KDE/.test(navigator.vendor)) {
danielebarchiesi@0 43 return;
danielebarchiesi@0 44 }
danielebarchiesi@0 45
danielebarchiesi@0 46 $('.wysiwyg', context).once('wysiwyg', function () {
danielebarchiesi@0 47 if (!this.id || typeof Drupal.settings.wysiwyg.triggers[this.id] === 'undefined') {
danielebarchiesi@0 48 return;
danielebarchiesi@0 49 }
danielebarchiesi@0 50 var $this = $(this);
danielebarchiesi@0 51 var params = Drupal.settings.wysiwyg.triggers[this.id];
danielebarchiesi@0 52 for (var format in params) {
danielebarchiesi@0 53 params[format].format = format;
danielebarchiesi@0 54 params[format].trigger = this.id;
danielebarchiesi@0 55 params[format].field = params.field;
danielebarchiesi@0 56 }
danielebarchiesi@0 57 var format = 'format' + this.value;
danielebarchiesi@0 58 // Directly attach this editor, if the input format is enabled or there is
danielebarchiesi@0 59 // only one input format at all.
danielebarchiesi@0 60 if ($this.is(':input')) {
danielebarchiesi@0 61 Drupal.wysiwygAttach(context, params[format]);
danielebarchiesi@0 62 }
danielebarchiesi@0 63 // Attach onChange handlers to input format selector elements.
danielebarchiesi@0 64 if ($this.is('select')) {
danielebarchiesi@0 65 $this.change(function() {
danielebarchiesi@0 66 // If not disabled, detach the current and attach a new editor.
danielebarchiesi@0 67 Drupal.wysiwygDetach(context, params[format]);
danielebarchiesi@0 68 format = 'format' + this.value;
danielebarchiesi@0 69 Drupal.wysiwygAttach(context, params[format]);
danielebarchiesi@0 70 });
danielebarchiesi@0 71 }
danielebarchiesi@0 72 // Detach any editor when the containing form is submitted.
danielebarchiesi@0 73 $('#' + params.field).parents('form').submit(function (event) {
danielebarchiesi@0 74 // Do not detach if the event was cancelled.
danielebarchiesi@0 75 if (event.isDefaultPrevented()) {
danielebarchiesi@0 76 return;
danielebarchiesi@0 77 }
danielebarchiesi@0 78 Drupal.wysiwygDetach(context, params[format], 'serialize');
danielebarchiesi@0 79 });
danielebarchiesi@0 80 });
danielebarchiesi@0 81 },
danielebarchiesi@0 82
danielebarchiesi@0 83 detach: function (context, settings, trigger) {
danielebarchiesi@0 84 var wysiwygs;
danielebarchiesi@0 85 // The 'serialize' trigger indicates that we should simply update the
danielebarchiesi@0 86 // underlying element with the new text, without destroying the editor.
danielebarchiesi@0 87 if (trigger == 'serialize') {
danielebarchiesi@0 88 // Removing the wysiwyg-processed class guarantees that the editor will
danielebarchiesi@0 89 // be reattached. Only do this if we're planning to destroy the editor.
danielebarchiesi@0 90 wysiwygs = $('.wysiwyg-processed', context);
danielebarchiesi@0 91 }
danielebarchiesi@0 92 else {
danielebarchiesi@0 93 wysiwygs = $('.wysiwyg', context).removeOnce('wysiwyg');
danielebarchiesi@0 94 }
danielebarchiesi@0 95 wysiwygs.each(function () {
danielebarchiesi@0 96 var params = Drupal.settings.wysiwyg.triggers[this.id];
danielebarchiesi@0 97 Drupal.wysiwygDetach(context, params, trigger);
danielebarchiesi@0 98 });
danielebarchiesi@0 99 }
danielebarchiesi@0 100 };
danielebarchiesi@0 101
danielebarchiesi@0 102 /**
danielebarchiesi@0 103 * Attach an editor to a target element.
danielebarchiesi@0 104 *
danielebarchiesi@0 105 * This tests whether the passed in editor implements the attach hook and
danielebarchiesi@0 106 * invokes it if available. Editor profile settings are cloned first, so they
danielebarchiesi@0 107 * cannot be overridden. After attaching the editor, the toggle link is shown
danielebarchiesi@0 108 * again, except in case we are attaching no editor.
danielebarchiesi@0 109 *
danielebarchiesi@0 110 * @param context
danielebarchiesi@0 111 * A DOM element, supplied by Drupal.attachBehaviors().
danielebarchiesi@0 112 * @param params
danielebarchiesi@0 113 * An object containing input format parameters.
danielebarchiesi@0 114 */
danielebarchiesi@0 115 Drupal.wysiwygAttach = function(context, params) {
danielebarchiesi@0 116 if (typeof Drupal.wysiwyg.editor.attach[params.editor] == 'function') {
danielebarchiesi@0 117 // (Re-)initialize field instance.
danielebarchiesi@0 118 Drupal.wysiwyg.instances[params.field] = {};
danielebarchiesi@0 119 // Provide all input format parameters to editor instance.
danielebarchiesi@0 120 jQuery.extend(Drupal.wysiwyg.instances[params.field], params);
danielebarchiesi@0 121 // Provide editor callbacks for plugins, if available.
danielebarchiesi@0 122 if (typeof Drupal.wysiwyg.editor.instance[params.editor] == 'object') {
danielebarchiesi@0 123 jQuery.extend(Drupal.wysiwyg.instances[params.field], Drupal.wysiwyg.editor.instance[params.editor]);
danielebarchiesi@0 124 }
danielebarchiesi@0 125 // Store this field id, so (external) plugins can use it.
danielebarchiesi@0 126 // @todo Wrong point in time. Probably can only supported by editors which
danielebarchiesi@0 127 // support an onFocus() or similar event.
danielebarchiesi@0 128 Drupal.wysiwyg.activeId = params.field;
danielebarchiesi@0 129 // Attach or update toggle link, if enabled.
danielebarchiesi@0 130 if (params.toggle) {
danielebarchiesi@0 131 Drupal.wysiwygAttachToggleLink(context, params);
danielebarchiesi@0 132 }
danielebarchiesi@0 133 // Otherwise, ensure that toggle link is hidden.
danielebarchiesi@0 134 else {
danielebarchiesi@0 135 $('#wysiwyg-toggle-' + params.field).hide();
danielebarchiesi@0 136 }
danielebarchiesi@0 137 // Attach editor, if enabled by default or last state was enabled.
danielebarchiesi@0 138 if (params.status) {
danielebarchiesi@0 139 Drupal.wysiwyg.editor.attach[params.editor](context, params, (Drupal.settings.wysiwyg.configs[params.editor] ? jQuery.extend(true, {}, Drupal.settings.wysiwyg.configs[params.editor][params.format]) : {}));
danielebarchiesi@0 140 }
danielebarchiesi@0 141 // Otherwise, attach default behaviors.
danielebarchiesi@0 142 else {
danielebarchiesi@0 143 Drupal.wysiwyg.editor.attach.none(context, params);
danielebarchiesi@0 144 Drupal.wysiwyg.instances[params.field].editor = 'none';
danielebarchiesi@0 145 }
danielebarchiesi@0 146 }
danielebarchiesi@0 147 };
danielebarchiesi@0 148
danielebarchiesi@0 149 /**
danielebarchiesi@0 150 * Detach all editors from a target element.
danielebarchiesi@0 151 *
danielebarchiesi@0 152 * @param context
danielebarchiesi@0 153 * A DOM element, supplied by Drupal.attachBehaviors().
danielebarchiesi@0 154 * @param params
danielebarchiesi@0 155 * An object containing input format parameters.
danielebarchiesi@0 156 * @param trigger
danielebarchiesi@0 157 * A string describing what is causing the editor to be detached.
danielebarchiesi@0 158 *
danielebarchiesi@0 159 * @see Drupal.detachBehaviors
danielebarchiesi@0 160 */
danielebarchiesi@0 161 Drupal.wysiwygDetach = function (context, params, trigger) {
danielebarchiesi@0 162 // Do not attempt to detach an unknown editor instance (Ajax).
danielebarchiesi@0 163 if (typeof Drupal.wysiwyg.instances[params.field] == 'undefined') {
danielebarchiesi@0 164 return;
danielebarchiesi@0 165 }
danielebarchiesi@0 166 trigger = trigger || 'unload';
danielebarchiesi@0 167 var editor = Drupal.wysiwyg.instances[params.field].editor;
danielebarchiesi@0 168 if (jQuery.isFunction(Drupal.wysiwyg.editor.detach[editor])) {
danielebarchiesi@0 169 Drupal.wysiwyg.editor.detach[editor](context, params, trigger);
danielebarchiesi@0 170 }
danielebarchiesi@0 171 };
danielebarchiesi@0 172
danielebarchiesi@0 173 /**
danielebarchiesi@0 174 * Append or update an editor toggle link to a target element.
danielebarchiesi@0 175 *
danielebarchiesi@0 176 * @param context
danielebarchiesi@0 177 * A DOM element, supplied by Drupal.attachBehaviors().
danielebarchiesi@0 178 * @param params
danielebarchiesi@0 179 * An object containing input format parameters.
danielebarchiesi@0 180 */
danielebarchiesi@0 181 Drupal.wysiwygAttachToggleLink = function(context, params) {
danielebarchiesi@0 182 if (!$('#wysiwyg-toggle-' + params.field).length) {
danielebarchiesi@0 183 var text = document.createTextNode(params.status ? Drupal.settings.wysiwyg.disable : Drupal.settings.wysiwyg.enable);
danielebarchiesi@0 184 var a = document.createElement('a');
danielebarchiesi@0 185 $(a).attr({ id: 'wysiwyg-toggle-' + params.field, href: 'javascript:void(0);' }).append(text);
danielebarchiesi@0 186 var div = document.createElement('div');
danielebarchiesi@0 187 $(div).addClass('wysiwyg-toggle-wrapper').append(a);
danielebarchiesi@0 188 $('#' + params.field).after(div);
danielebarchiesi@0 189 }
danielebarchiesi@0 190 $('#wysiwyg-toggle-' + params.field)
danielebarchiesi@0 191 .html(params.status ? Drupal.settings.wysiwyg.disable : Drupal.settings.wysiwyg.enable).show()
danielebarchiesi@0 192 .unbind('click.wysiwyg', Drupal.wysiwyg.toggleWysiwyg)
danielebarchiesi@0 193 .bind('click.wysiwyg', { params: params, context: context }, Drupal.wysiwyg.toggleWysiwyg);
danielebarchiesi@0 194
danielebarchiesi@0 195 // Hide toggle link in case no editor is attached.
danielebarchiesi@0 196 if (params.editor == 'none') {
danielebarchiesi@0 197 $('#wysiwyg-toggle-' + params.field).hide();
danielebarchiesi@0 198 }
danielebarchiesi@0 199 };
danielebarchiesi@0 200
danielebarchiesi@0 201 /**
danielebarchiesi@0 202 * Callback for the Enable/Disable rich editor link.
danielebarchiesi@0 203 */
danielebarchiesi@0 204 Drupal.wysiwyg.toggleWysiwyg = function (event) {
danielebarchiesi@0 205 var context = event.data.context;
danielebarchiesi@0 206 var params = event.data.params;
danielebarchiesi@0 207 if (params.status) {
danielebarchiesi@0 208 // Detach current editor.
danielebarchiesi@0 209 params.status = false;
danielebarchiesi@0 210 Drupal.wysiwygDetach(context, params);
danielebarchiesi@0 211 // After disabling the editor, re-attach default behaviors.
danielebarchiesi@0 212 // @todo We HAVE TO invoke Drupal.wysiwygAttach() here.
danielebarchiesi@0 213 Drupal.wysiwyg.editor.attach.none(context, params);
danielebarchiesi@0 214 Drupal.wysiwyg.instances[params.field] = Drupal.wysiwyg.editor.instance.none;
danielebarchiesi@0 215 Drupal.wysiwyg.instances[params.field].editor = 'none';
danielebarchiesi@0 216 Drupal.wysiwyg.instances[params.field].field = params.field;
danielebarchiesi@0 217 $(this).html(Drupal.settings.wysiwyg.enable).blur();
danielebarchiesi@0 218 }
danielebarchiesi@0 219 else {
danielebarchiesi@0 220 // Before enabling the editor, detach default behaviors.
danielebarchiesi@0 221 Drupal.wysiwyg.editor.detach.none(context, params);
danielebarchiesi@0 222 // Attach new editor using parameters of the currently selected input format.
danielebarchiesi@0 223 params = Drupal.settings.wysiwyg.triggers[params.trigger]['format' + $('#' + params.trigger).val()];
danielebarchiesi@0 224 params.status = true;
danielebarchiesi@0 225 Drupal.wysiwygAttach(context, params);
danielebarchiesi@0 226 $(this).html(Drupal.settings.wysiwyg.disable).blur();
danielebarchiesi@0 227 }
danielebarchiesi@0 228 }
danielebarchiesi@0 229
danielebarchiesi@0 230 /**
danielebarchiesi@0 231 * Parse the CSS classes of an input format DOM element into parameters.
danielebarchiesi@0 232 *
danielebarchiesi@0 233 * Syntax for CSS classes is "wysiwyg-name-value".
danielebarchiesi@0 234 *
danielebarchiesi@0 235 * @param element
danielebarchiesi@0 236 * An input format DOM element containing CSS classes to parse.
danielebarchiesi@0 237 * @param params
danielebarchiesi@0 238 * (optional) An object containing input format parameters to update.
danielebarchiesi@0 239 */
danielebarchiesi@0 240 Drupal.wysiwyg.getParams = function(element, params) {
danielebarchiesi@0 241 var classes = element.className.split(' ');
danielebarchiesi@0 242 var params = params || {};
danielebarchiesi@0 243 for (var i = 0; i < classes.length; i++) {
danielebarchiesi@0 244 if (classes[i].substr(0, 8) == 'wysiwyg-') {
danielebarchiesi@0 245 var parts = classes[i].split('-');
danielebarchiesi@0 246 var value = parts.slice(2).join('-');
danielebarchiesi@0 247 params[parts[1]] = value;
danielebarchiesi@0 248 }
danielebarchiesi@0 249 }
danielebarchiesi@0 250 // Convert format id into string.
danielebarchiesi@0 251 params.format = 'format' + params.format;
danielebarchiesi@0 252 // Convert numeric values.
danielebarchiesi@0 253 params.status = parseInt(params.status, 10);
danielebarchiesi@0 254 params.toggle = parseInt(params.toggle, 10);
danielebarchiesi@0 255 params.resizable = parseInt(params.resizable, 10);
danielebarchiesi@0 256 return params;
danielebarchiesi@0 257 };
danielebarchiesi@0 258
danielebarchiesi@0 259 /**
danielebarchiesi@0 260 * Allow certain editor libraries to initialize before the DOM is loaded.
danielebarchiesi@0 261 */
danielebarchiesi@0 262 Drupal.wysiwygInit();
danielebarchiesi@0 263
danielebarchiesi@0 264 // Respond to CTools detach behaviors event.
danielebarchiesi@0 265 $(document).bind('CToolsDetachBehaviors', function(event, context) {
danielebarchiesi@0 266 Drupal.behaviors.attachWysiwyg.detach(context, {}, 'unload');
danielebarchiesi@0 267 });
danielebarchiesi@0 268
danielebarchiesi@0 269 })(jQuery);