danielebarchiesi@0
|
1
|
danielebarchiesi@0
|
2 var wysiwygWhizzywig = { currentField: null, fields: {} };
|
danielebarchiesi@0
|
3 var buttonPath = null;
|
danielebarchiesi@0
|
4
|
danielebarchiesi@0
|
5 /**
|
danielebarchiesi@0
|
6 * Override Whizzywig's document.write() function.
|
danielebarchiesi@0
|
7 *
|
danielebarchiesi@0
|
8 * Whizzywig uses document.write() by default, which leads to a blank page when
|
danielebarchiesi@0
|
9 * invoked in jQuery.ready(). Luckily, Whizzywig developers implemented a
|
danielebarchiesi@0
|
10 * shorthand w() substitute function that we can override to redirect the output
|
danielebarchiesi@0
|
11 * into the global wysiwygWhizzywig variable.
|
danielebarchiesi@0
|
12 *
|
danielebarchiesi@0
|
13 * @see o()
|
danielebarchiesi@0
|
14 */
|
danielebarchiesi@0
|
15 var w = function (string) {
|
danielebarchiesi@0
|
16 if (string) {
|
danielebarchiesi@0
|
17 wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] += string;
|
danielebarchiesi@0
|
18 }
|
danielebarchiesi@0
|
19 return wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField];
|
danielebarchiesi@0
|
20 };
|
danielebarchiesi@0
|
21
|
danielebarchiesi@0
|
22 /**
|
danielebarchiesi@0
|
23 * Override Whizzywig's document.getElementById() function.
|
danielebarchiesi@0
|
24 *
|
danielebarchiesi@0
|
25 * Since we redirect the output of w() into a temporary string upon attaching
|
danielebarchiesi@0
|
26 * an editor, we also have to override the o() shorthand substitute function
|
danielebarchiesi@0
|
27 * for document.getElementById() to search in the document or our container.
|
danielebarchiesi@0
|
28 * This override function also inserts the editor instance when Whizzywig
|
danielebarchiesi@0
|
29 * tries to access its IFRAME, so it has access to the full/regular window
|
danielebarchiesi@0
|
30 * object.
|
danielebarchiesi@0
|
31 *
|
danielebarchiesi@0
|
32 * @see w()
|
danielebarchiesi@0
|
33 */
|
danielebarchiesi@0
|
34 var o = function (id) {
|
danielebarchiesi@0
|
35 // Upon first access to "whizzy" + id, Whizzywig tries to access its IFRAME,
|
danielebarchiesi@0
|
36 // so we need to insert the editor into the DOM.
|
danielebarchiesi@0
|
37 if (id == 'whizzy' + wysiwygWhizzywig.currentField && wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField]) {
|
danielebarchiesi@0
|
38 jQuery('#' + wysiwygWhizzywig.currentField).after('<div id="' + wysiwygWhizzywig.currentField + '-whizzywig"></div>');
|
danielebarchiesi@0
|
39 // Iframe's .contentWindow becomes null in Webkit if inserted via .after().
|
danielebarchiesi@0
|
40 jQuery('#' + wysiwygWhizzywig.currentField + '-whizzywig').html(w());
|
danielebarchiesi@0
|
41 // Prevent subsequent invocations from inserting the editor multiple times.
|
danielebarchiesi@0
|
42 wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] = '';
|
danielebarchiesi@0
|
43 }
|
danielebarchiesi@0
|
44 // If id exists in the regular window.document, return it.
|
danielebarchiesi@0
|
45 if (jQuery('#' + id).size()) {
|
danielebarchiesi@0
|
46 return jQuery('#' + id).get(0);
|
danielebarchiesi@0
|
47 }
|
danielebarchiesi@0
|
48 // Otherwise return id from our container.
|
danielebarchiesi@0
|
49 return jQuery('#' + id, w()).get(0);
|
danielebarchiesi@0
|
50 };
|
danielebarchiesi@0
|
51
|
danielebarchiesi@0
|
52 (function($) {
|
danielebarchiesi@0
|
53
|
danielebarchiesi@0
|
54 /**
|
danielebarchiesi@0
|
55 * Attach this editor to a target element.
|
danielebarchiesi@0
|
56 */
|
danielebarchiesi@0
|
57 Drupal.wysiwyg.editor.attach.whizzywig = function(context, params, settings) {
|
danielebarchiesi@0
|
58 // Assign button images path, if available.
|
danielebarchiesi@0
|
59 if (settings.buttonPath) {
|
danielebarchiesi@0
|
60 window.buttonPath = settings.buttonPath;
|
danielebarchiesi@0
|
61 }
|
danielebarchiesi@0
|
62 // Create Whizzywig container.
|
danielebarchiesi@0
|
63 wysiwygWhizzywig.currentField = params.field;
|
danielebarchiesi@0
|
64 wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] = '';
|
danielebarchiesi@0
|
65 // Whizzywig needs to have the width set 'inline'.
|
danielebarchiesi@0
|
66 $field = $('#' + params.field);
|
danielebarchiesi@0
|
67 var originalValues = Drupal.wysiwyg.instances[params.field];
|
danielebarchiesi@0
|
68 originalValues.originalStyle = $field.attr('style');
|
danielebarchiesi@0
|
69 $field.css('width', $field.width() + 'px');
|
danielebarchiesi@0
|
70
|
danielebarchiesi@0
|
71 // Attach editor.
|
danielebarchiesi@0
|
72 makeWhizzyWig(params.field, (settings.buttons ? settings.buttons : 'all'));
|
danielebarchiesi@0
|
73 // Whizzywig fails to detect and set initial textarea contents.
|
danielebarchiesi@0
|
74 $('#whizzy' + params.field).contents().find('body').html(tidyD($field.val()));
|
danielebarchiesi@0
|
75 };
|
danielebarchiesi@0
|
76
|
danielebarchiesi@0
|
77 /**
|
danielebarchiesi@0
|
78 * Detach a single or all editors.
|
danielebarchiesi@0
|
79 */
|
danielebarchiesi@0
|
80 Drupal.wysiwyg.editor.detach.whizzywig = function (context, params, trigger) {
|
danielebarchiesi@0
|
81 var detach = function (index) {
|
danielebarchiesi@0
|
82 var id = whizzies[index], $field = $('#' + id), instance = Drupal.wysiwyg.instances[id];
|
danielebarchiesi@0
|
83
|
danielebarchiesi@0
|
84 // Save contents of editor back into textarea.
|
danielebarchiesi@0
|
85 $field.val(instance.getContent());
|
danielebarchiesi@0
|
86 // If the editor is just being serialized (not detached), our work is done.
|
danielebarchiesi@0
|
87 if (trigger == 'serialize') {
|
danielebarchiesi@0
|
88 return;
|
danielebarchiesi@0
|
89 }
|
danielebarchiesi@0
|
90 // Remove editor instance.
|
danielebarchiesi@0
|
91 $('#' + id + '-whizzywig').remove();
|
danielebarchiesi@0
|
92 whizzies.splice(index, 1);
|
danielebarchiesi@0
|
93
|
danielebarchiesi@0
|
94 // Restore original textarea styling.
|
danielebarchiesi@0
|
95 $field.removeAttr('style').attr('style', instance.originalStyle);
|
danielebarchiesi@0
|
96 };
|
danielebarchiesi@0
|
97
|
danielebarchiesi@0
|
98 if (typeof params != 'undefined') {
|
danielebarchiesi@0
|
99 for (var i = 0; i < whizzies.length; i++) {
|
danielebarchiesi@0
|
100 if (whizzies[i] == params.field) {
|
danielebarchiesi@0
|
101 detach(i);
|
danielebarchiesi@0
|
102 break;
|
danielebarchiesi@0
|
103 }
|
danielebarchiesi@0
|
104 }
|
danielebarchiesi@0
|
105 }
|
danielebarchiesi@0
|
106 else {
|
danielebarchiesi@0
|
107 while (whizzies.length > 0) {
|
danielebarchiesi@0
|
108 detach(0);
|
danielebarchiesi@0
|
109 }
|
danielebarchiesi@0
|
110 }
|
danielebarchiesi@0
|
111 };
|
danielebarchiesi@0
|
112
|
danielebarchiesi@0
|
113 /**
|
danielebarchiesi@0
|
114 * Instance methods for Whizzywig.
|
danielebarchiesi@0
|
115 */
|
danielebarchiesi@0
|
116 Drupal.wysiwyg.editor.instance.whizzywig = {
|
danielebarchiesi@0
|
117 insert: function (content) {
|
danielebarchiesi@0
|
118 // Whizzywig executes any string beginning with 'js:'.
|
danielebarchiesi@0
|
119 insHTML(content.replace(/^js:/, 'js:'));
|
danielebarchiesi@0
|
120 },
|
danielebarchiesi@0
|
121
|
danielebarchiesi@0
|
122 setContent: function (content) {
|
danielebarchiesi@0
|
123 var $field = $('#' + this.field);
|
danielebarchiesi@0
|
124 // Whizzywig shows the original textarea in source mode.
|
danielebarchiesi@0
|
125 if ($field.css('display') == 'block') {
|
danielebarchiesi@0
|
126 $field.val(content);
|
danielebarchiesi@0
|
127 }
|
danielebarchiesi@0
|
128 else {
|
danielebarchiesi@0
|
129 var doc = $('#whizzy' + this.field).contents()[0];
|
danielebarchiesi@0
|
130 doc.open();
|
danielebarchiesi@0
|
131 doc.write(content);
|
danielebarchiesi@0
|
132 doc.close();
|
danielebarchiesi@0
|
133 }
|
danielebarchiesi@0
|
134 },
|
danielebarchiesi@0
|
135
|
danielebarchiesi@0
|
136 getContent: function () {
|
danielebarchiesi@0
|
137 var $field = $('#' + this.field),
|
danielebarchiesi@0
|
138 // Whizzywig shows the original textarea in source mode.
|
danielebarchiesi@0
|
139 content = ($field.css('display') == 'block' ?
|
danielebarchiesi@0
|
140 $field.val() : $('#whizzy' + this.field).contents().find('body').html()
|
danielebarchiesi@0
|
141 );
|
danielebarchiesi@0
|
142
|
danielebarchiesi@0
|
143 content = tidyH(content);
|
danielebarchiesi@0
|
144 // Whizzywig's get_xhtml() addon, if defined, expects a DOM node.
|
danielebarchiesi@0
|
145 if ($.isFunction(window.get_xhtml)) {
|
danielebarchiesi@0
|
146 var pre = document.createElement('pre');
|
danielebarchiesi@0
|
147 pre.innerHTML = content;
|
danielebarchiesi@0
|
148 content = get_xhtml(pre);
|
danielebarchiesi@0
|
149 }
|
danielebarchiesi@0
|
150 return content.replace(location.href + '#', '#');
|
danielebarchiesi@0
|
151 }
|
danielebarchiesi@0
|
152 };
|
danielebarchiesi@0
|
153
|
danielebarchiesi@0
|
154 })(jQuery);
|