danielebarchiesi@0: danielebarchiesi@0: var wysiwygWhizzywig = { currentField: null, fields: {} }; danielebarchiesi@0: var buttonPath = null; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Override Whizzywig's document.write() function. danielebarchiesi@0: * danielebarchiesi@0: * Whizzywig uses document.write() by default, which leads to a blank page when danielebarchiesi@0: * invoked in jQuery.ready(). Luckily, Whizzywig developers implemented a danielebarchiesi@0: * shorthand w() substitute function that we can override to redirect the output danielebarchiesi@0: * into the global wysiwygWhizzywig variable. danielebarchiesi@0: * danielebarchiesi@0: * @see o() danielebarchiesi@0: */ danielebarchiesi@0: var w = function (string) { danielebarchiesi@0: if (string) { danielebarchiesi@0: wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] += string; danielebarchiesi@0: } danielebarchiesi@0: return wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField]; danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Override Whizzywig's document.getElementById() function. danielebarchiesi@0: * danielebarchiesi@0: * Since we redirect the output of w() into a temporary string upon attaching danielebarchiesi@0: * an editor, we also have to override the o() shorthand substitute function danielebarchiesi@0: * for document.getElementById() to search in the document or our container. danielebarchiesi@0: * This override function also inserts the editor instance when Whizzywig danielebarchiesi@0: * tries to access its IFRAME, so it has access to the full/regular window danielebarchiesi@0: * object. danielebarchiesi@0: * danielebarchiesi@0: * @see w() danielebarchiesi@0: */ danielebarchiesi@0: var o = function (id) { danielebarchiesi@0: // Upon first access to "whizzy" + id, Whizzywig tries to access its IFRAME, danielebarchiesi@0: // so we need to insert the editor into the DOM. danielebarchiesi@0: if (id == 'whizzy' + wysiwygWhizzywig.currentField && wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField]) { danielebarchiesi@0: jQuery('#' + wysiwygWhizzywig.currentField).after('
'); danielebarchiesi@0: // Iframe's .contentWindow becomes null in Webkit if inserted via .after(). danielebarchiesi@0: jQuery('#' + wysiwygWhizzywig.currentField + '-whizzywig').html(w()); danielebarchiesi@0: // Prevent subsequent invocations from inserting the editor multiple times. danielebarchiesi@0: wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] = ''; danielebarchiesi@0: } danielebarchiesi@0: // If id exists in the regular window.document, return it. danielebarchiesi@0: if (jQuery('#' + id).size()) { danielebarchiesi@0: return jQuery('#' + id).get(0); danielebarchiesi@0: } danielebarchiesi@0: // Otherwise return id from our container. danielebarchiesi@0: return jQuery('#' + id, w()).get(0); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: (function($) { danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Attach this editor to a target element. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.wysiwyg.editor.attach.whizzywig = function(context, params, settings) { danielebarchiesi@0: // Assign button images path, if available. danielebarchiesi@0: if (settings.buttonPath) { danielebarchiesi@0: window.buttonPath = settings.buttonPath; danielebarchiesi@0: } danielebarchiesi@0: // Create Whizzywig container. danielebarchiesi@0: wysiwygWhizzywig.currentField = params.field; danielebarchiesi@0: wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] = ''; danielebarchiesi@0: // Whizzywig needs to have the width set 'inline'. danielebarchiesi@0: $field = $('#' + params.field); danielebarchiesi@0: var originalValues = Drupal.wysiwyg.instances[params.field]; danielebarchiesi@0: originalValues.originalStyle = $field.attr('style'); danielebarchiesi@0: $field.css('width', $field.width() + 'px'); danielebarchiesi@0: danielebarchiesi@0: // Attach editor. danielebarchiesi@0: makeWhizzyWig(params.field, (settings.buttons ? settings.buttons : 'all')); danielebarchiesi@0: // Whizzywig fails to detect and set initial textarea contents. danielebarchiesi@0: $('#whizzy' + params.field).contents().find('body').html(tidyD($field.val())); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Detach a single or all editors. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.wysiwyg.editor.detach.whizzywig = function (context, params, trigger) { danielebarchiesi@0: var detach = function (index) { danielebarchiesi@0: var id = whizzies[index], $field = $('#' + id), instance = Drupal.wysiwyg.instances[id]; danielebarchiesi@0: danielebarchiesi@0: // Save contents of editor back into textarea. danielebarchiesi@0: $field.val(instance.getContent()); danielebarchiesi@0: // If the editor is just being serialized (not detached), our work is done. danielebarchiesi@0: if (trigger == 'serialize') { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: // Remove editor instance. danielebarchiesi@0: $('#' + id + '-whizzywig').remove(); danielebarchiesi@0: whizzies.splice(index, 1); danielebarchiesi@0: danielebarchiesi@0: // Restore original textarea styling. danielebarchiesi@0: $field.removeAttr('style').attr('style', instance.originalStyle); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: if (typeof params != 'undefined') { danielebarchiesi@0: for (var i = 0; i < whizzies.length; i++) { danielebarchiesi@0: if (whizzies[i] == params.field) { danielebarchiesi@0: detach(i); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: while (whizzies.length > 0) { danielebarchiesi@0: detach(0); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Instance methods for Whizzywig. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.wysiwyg.editor.instance.whizzywig = { danielebarchiesi@0: insert: function (content) { danielebarchiesi@0: // Whizzywig executes any string beginning with 'js:'. danielebarchiesi@0: insHTML(content.replace(/^js:/, 'js:')); danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: setContent: function (content) { danielebarchiesi@0: var $field = $('#' + this.field); danielebarchiesi@0: // Whizzywig shows the original textarea in source mode. danielebarchiesi@0: if ($field.css('display') == 'block') { danielebarchiesi@0: $field.val(content); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: var doc = $('#whizzy' + this.field).contents()[0]; danielebarchiesi@0: doc.open(); danielebarchiesi@0: doc.write(content); danielebarchiesi@0: doc.close(); danielebarchiesi@0: } danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: getContent: function () { danielebarchiesi@0: var $field = $('#' + this.field), danielebarchiesi@0: // Whizzywig shows the original textarea in source mode. danielebarchiesi@0: content = ($field.css('display') == 'block' ? danielebarchiesi@0: $field.val() : $('#whizzy' + this.field).contents().find('body').html() danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: content = tidyH(content); danielebarchiesi@0: // Whizzywig's get_xhtml() addon, if defined, expects a DOM node. danielebarchiesi@0: if ($.isFunction(window.get_xhtml)) { danielebarchiesi@0: var pre = document.createElement('pre'); danielebarchiesi@0: pre.innerHTML = content; danielebarchiesi@0: content = get_xhtml(pre); danielebarchiesi@0: } danielebarchiesi@0: return content.replace(location.href + '#', '#'); danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: })(jQuery);