whizzywig-56.js 5.2 KB

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