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 // Previous versions used per-button images found in this location,
|
danielebarchiesi@0
|
59 // now it is only used for custom buttons.
|
danielebarchiesi@0
|
60 if (settings.buttonPath) {
|
danielebarchiesi@0
|
61 window.buttonPath = settings.buttonPath;
|
danielebarchiesi@0
|
62 }
|
danielebarchiesi@0
|
63 // Assign the toolbar image path used for native buttons, if available.
|
danielebarchiesi@0
|
64 if (settings.toolbarImagePath) {
|
danielebarchiesi@0
|
65 btn._f = settings.toolbarImagePath;
|
danielebarchiesi@0
|
66 }
|
danielebarchiesi@0
|
67 // Fall back to text labels for all buttons.
|
danielebarchiesi@0
|
68 else {
|
danielebarchiesi@0
|
69 window.buttonPath = 'textbuttons';
|
danielebarchiesi@0
|
70 }
|
danielebarchiesi@0
|
71 // Create Whizzywig container.
|
danielebarchiesi@0
|
72 wysiwygWhizzywig.currentField = params.field;
|
danielebarchiesi@0
|
73 wysiwygWhizzywig.fields[wysiwygWhizzywig.currentField] = '';
|
danielebarchiesi@0
|
74 // Whizzywig needs to have the width set 'inline'.
|
danielebarchiesi@0
|
75 $field = $('#' + params.field);
|
danielebarchiesi@0
|
76 var originalValues = Drupal.wysiwyg.instances[params.field];
|
danielebarchiesi@0
|
77 originalValues.originalStyle = $field.attr('style');
|
danielebarchiesi@0
|
78 $field.css('width', $field.width() + 'px');
|
danielebarchiesi@0
|
79
|
danielebarchiesi@0
|
80 // Attach editor.
|
danielebarchiesi@0
|
81 makeWhizzyWig(params.field, (settings.buttons ? settings.buttons : 'all'));
|
danielebarchiesi@0
|
82 // Whizzywig fails to detect and set initial textarea contents.
|
danielebarchiesi@0
|
83 $('#whizzy' + params.field).contents().find('body').html(tidyD($field.val()));
|
danielebarchiesi@0
|
84 };
|
danielebarchiesi@0
|
85
|
danielebarchiesi@0
|
86 /**
|
danielebarchiesi@0
|
87 * Detach a single or all editors.
|
danielebarchiesi@0
|
88 */
|
danielebarchiesi@0
|
89 Drupal.wysiwyg.editor.detach.whizzywig = function (context, params, trigger) {
|
danielebarchiesi@0
|
90 var detach = function (index) {
|
danielebarchiesi@0
|
91 var id = whizzies[index], $field = $('#' + id), instance = Drupal.wysiwyg.instances[id];
|
danielebarchiesi@0
|
92
|
danielebarchiesi@0
|
93 // Save contents of editor back into textarea.
|
danielebarchiesi@0
|
94 $field.val(instance.getContent());
|
danielebarchiesi@0
|
95 // If the editor is just being serialized (not detached), our work is done.
|
danielebarchiesi@0
|
96 if (trigger == 'serialize') {
|
danielebarchiesi@0
|
97 return;
|
danielebarchiesi@0
|
98 }
|
danielebarchiesi@0
|
99 // Remove editor instance.
|
danielebarchiesi@0
|
100 $('#' + id + '-whizzywig').remove();
|
danielebarchiesi@0
|
101 whizzies.splice(index, 1);
|
danielebarchiesi@0
|
102
|
danielebarchiesi@0
|
103 // Restore original textarea styling.
|
danielebarchiesi@0
|
104 $field.removeAttr('style').attr('style', instance.originalStyle);
|
danielebarchiesi@0
|
105 };
|
danielebarchiesi@0
|
106
|
danielebarchiesi@0
|
107 if (typeof params != 'undefined') {
|
danielebarchiesi@0
|
108 for (var i = 0; i < whizzies.length; i++) {
|
danielebarchiesi@0
|
109 if (whizzies[i] == params.field) {
|
danielebarchiesi@0
|
110 detach(i);
|
danielebarchiesi@0
|
111 break;
|
danielebarchiesi@0
|
112 }
|
danielebarchiesi@0
|
113 }
|
danielebarchiesi@0
|
114 }
|
danielebarchiesi@0
|
115 else {
|
danielebarchiesi@0
|
116 while (whizzies.length > 0) {
|
danielebarchiesi@0
|
117 detach(0);
|
danielebarchiesi@0
|
118 }
|
danielebarchiesi@0
|
119 }
|
danielebarchiesi@0
|
120 };
|
danielebarchiesi@0
|
121
|
danielebarchiesi@0
|
122 /**
|
danielebarchiesi@0
|
123 * Instance methods for Whizzywig.
|
danielebarchiesi@0
|
124 */
|
danielebarchiesi@0
|
125 Drupal.wysiwyg.editor.instance.whizzywig = {
|
danielebarchiesi@0
|
126 insert: function (content) {
|
danielebarchiesi@0
|
127 // Whizzywig executes any string beginning with 'js:'.
|
danielebarchiesi@0
|
128 insHTML(content.replace(/^js:/, 'js:'));
|
danielebarchiesi@0
|
129 },
|
danielebarchiesi@0
|
130
|
danielebarchiesi@0
|
131 setContent: function (content) {
|
danielebarchiesi@0
|
132 // Whizzywig shows the original textarea in source mode.
|
danielebarchiesi@0
|
133 if ($field.css('display') == 'block') {
|
danielebarchiesi@0
|
134 $('#' + this.field).val(content);
|
danielebarchiesi@0
|
135 }
|
danielebarchiesi@0
|
136 else {
|
danielebarchiesi@0
|
137 var doc = $('#whizzy' + this.field).contents()[0];
|
danielebarchiesi@0
|
138 doc.open();
|
danielebarchiesi@0
|
139 doc.write(content);
|
danielebarchiesi@0
|
140 doc.close();
|
danielebarchiesi@0
|
141 }
|
danielebarchiesi@0
|
142 },
|
danielebarchiesi@0
|
143
|
danielebarchiesi@0
|
144 getContent: function () {
|
danielebarchiesi@0
|
145 // Whizzywig's tidyH() expects a document node. Clone the editing iframe's
|
danielebarchiesi@0
|
146 // document so tidyH() won't mess with it if this gets called while editing.
|
danielebarchiesi@0
|
147 var clone = $($('#whizzy' + this.field).contents()[0].documentElement).clone()[0].ownerDocument;
|
danielebarchiesi@0
|
148 // Whizzywig shows the original textarea in source mode so update the body.
|
danielebarchiesi@0
|
149 if ($field.css('display') == 'block') {
|
danielebarchiesi@0
|
150 clone.body.innerHTML = $('#' + this.field).val();
|
danielebarchiesi@0
|
151 }
|
danielebarchiesi@0
|
152 return tidyH(clone);
|
danielebarchiesi@0
|
153 }
|
danielebarchiesi@0
|
154 };
|
danielebarchiesi@0
|
155 })(jQuery);
|