| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 | /** * @file * JavaScript to activate "Insert" buttons on file and image fields. */(function ($) {/** * Behavior to add "Insert" buttons. */Drupal.behaviors.insert = {};Drupal.behaviors.insert.attach = function(context) {  if (typeof(insertTextarea) == 'undefined') {    insertTextarea = $('#edit-body textarea.text-full').get(0) || false;  }  // Keep track of the last active textarea (if not using WYSIWYG).  $('textarea:not([name$="[data][title]"]):not(.insert-processed)', context).addClass('insert-processed').focus(insertSetActive).blur(insertRemoveActive);  // Add the click handler to the insert button.  $('.insert-button:not(.insert-processed)', context).addClass('insert-processed').click(insert);  function insertSetActive() {    insertTextarea = this;    this.insertHasFocus = true;  }  function insertRemoveActive() {    if (insertTextarea == this) {      var thisTextarea = this;      setTimeout(function() {        thisTextarea.insertHasFocus = false;      }, 1000);    }  }  function insert() {    var widgetType = $(this).attr('rel');    var settings = Drupal.settings.insert.widgets[widgetType];    var wrapper = $(this).parents(settings.wrapper).filter(':first').get(0);    var style = $('.insert-style', wrapper).val();    var content = $('input.insert-template[name$="[' + style + ']"]', wrapper).val();    var filename = $('input.insert-filename', wrapper).val();    var options = {      widgetType: widgetType,      filename: filename,      style: style,      fields: {}    };    // Update replacements.    for (var fieldName in settings.fields) {      var fieldValue = $(settings.fields[fieldName], wrapper).val();      if (fieldValue) {        fieldValue = fieldValue          .replace(/&/g, '&')          .replace(/"/g, '"')          .replace(/'/g, ''')          .replace(/</g, '<')          .replace(/>/g, '>');      }      options['fields'][fieldName] = fieldValue;      if (fieldValue) {        var fieldRegExp = new RegExp('__' + fieldName + '(_or_filename)?__', 'g');        content = content.replace(fieldRegExp, fieldValue);      }      else {        var fieldRegExp = new RegExp('__' + fieldName + '_or_filename__', 'g');        content = content.replace(fieldRegExp, filename);      }    }    // File name replacement.    var fieldRegExp = new RegExp('__filename__', 'g');    content = content.replace(fieldRegExp, filename);    // Check for a maximum dimension and scale down the width if necessary.    // This is intended for use with Image Resize Filter.    var widthMatches = content.match(/width[ ]*=[ ]*"(\d*)"/i);    var heightMatches = content.match(/height[ ]*=[ ]*"(\d*)"/i);    if (settings.maxWidth && widthMatches && parseInt(widthMatches[1]) > settings.maxWidth) {      var insertRatio = settings.maxWidth / widthMatches[1];      var width = settings.maxWidth;      content = content.replace(/width[ ]*=[ ]*"?(\d*)"?/i, 'width="' + width + '"');      if (heightMatches) {        var height = Math.round(heightMatches[1] * insertRatio);        content = content.replace(/height[ ]*=[ ]*"?(\d*)"?/i, 'height="' + height + '"');      }    }    // Allow other modules to perform replacements.    options['content'] = content;    $.event.trigger('insertIntoActiveEditor', [options]);    content = options['content'];    // Cleanup unused replacements.    content = content.replace(/"__([a-z0-9_]+)__"/g, '""');    // Cleanup empty attributes (other than alt).    content = content.replace(/([a-z]+)[ ]*=[ ]*""/g, function(match, tagName) {      return (tagName === 'alt') ? match : '';    });    // Insert the text.    Drupal.insert.insertIntoActiveEditor(content);  }};// General Insert API functions.Drupal.insert = {  /**   * Insert content into the current (or last active) editor on the page. This   * should work with most WYSIWYGs as well as plain textareas.   *   * @param content   */  insertIntoActiveEditor: function(content) {    var editorElement;    // Always work in normal text areas that currently have focus.    if (insertTextarea && insertTextarea.insertHasFocus) {      editorElement = insertTextarea;      Drupal.insert.insertAtCursor(insertTextarea, content);    }    // Direct tinyMCE support.    else if (typeof(tinyMCE) != 'undefined' && tinyMCE.activeEditor) {      editorElement = document.getElementById(tinyMCE.activeEditor.editorId);      Drupal.insert.activateTabPane(editorElement);      tinyMCE.activeEditor.execCommand('mceInsertContent', false, content);    }    // WYSIWYG support, should work in all editors if available.    else if (Drupal.wysiwyg && Drupal.wysiwyg.activeId) {      editorElement = document.getElementById(Drupal.wysiwyg.activeId);      Drupal.insert.activateTabPane(editorElement);      Drupal.wysiwyg.instances[Drupal.wysiwyg.activeId].insert(content)    }    // FCKeditor module support.    else if (typeof(FCKeditorAPI) != 'undefined' && typeof(fckActiveId) != 'undefined') {      editorElement = document.getElementById(fckActiveId);      Drupal.insert.activateTabPane(editorElement);      FCKeditorAPI.Instances[fckActiveId].InsertHtml(content);    }    // Direct FCKeditor support (only body field supported).    else if (typeof(FCKeditorAPI) != 'undefined') {      // Try inserting into the body.      if (FCKeditorAPI.Instances[insertTextarea.id]) {        editorElement = insertTextarea;        Drupal.insert.activateTabPane(editorElement);        FCKeditorAPI.Instances[insertTextarea.id].InsertHtml(content);      }      // Try inserting into the first instance we find (may occur with very      // old versions of FCKeditor).      else {        for (var n in FCKeditorAPI.Instances) {          editorElement = document.getElementById(n);          Drupal.insert.activateTabPane(editorElement);          FCKeditorAPI.Instances[n].InsertHtml(content);          break;        }      }    }    // CKeditor module support.    else if (typeof(CKEDITOR) != 'undefined' && typeof(Drupal.ckeditorActiveId) != 'undefined') {      editorElement = document.getElementById(Drupal.ckeditorActiveId);      Drupal.insert.activateTabPane(editorElement);      CKEDITOR.instances[Drupal.ckeditorActiveId].insertHtml(content);    }    // Direct CKeditor support (only body field supported).    else if (typeof(CKEDITOR) != 'undefined' && CKEDITOR.instances[insertTextarea.id]) {      editorElement = insertTextarea;      Drupal.insert.activateTabPane(editorElement);      CKEDITOR.instances[insertTextarea.id].insertHtml(content);    }    else if (insertTextarea) {      editorElement = insertTextarea;      Drupal.insert.activateTabPane(editorElement);      Drupal.insert.insertAtCursor(insertTextarea, content);    }    if (editorElement) {      Drupal.insert.contentWarning(editorElement, content);    }    return false;  },  /**   * Check for vertical tabs and activate the pane containing the editor.   *   * @param editor   *   The DOM object of the editor that will be checked.   */  activateTabPane: function(editor) {    var $pane = $(editor).parents('.vertical-tabs-pane:first');    var $panes = $pane.parent('.vertical-tabs-panes');    var $tabs = $panes.parents('.vertical-tabs:first').find('ul.vertical-tabs-list:first li a');    if ($pane.size() && $pane.is(':hidden') && $panes.size() && $tabs.size()) {      var index = $panes.children().index($pane);      $tabs.eq(index).click();    }  },  /**   * Warn users when attempting to insert an image into an unsupported field.   *   * This function is only a 90% use-case, as it doesn't support when the filter   * tip are hidden, themed, or when only one format is available. However it   * should fail silently in these situations.   */  contentWarning: function(editorElement, content) {    if (!content.match(/<img /)) return;    var $wrapper = $(editorElement).parents('div.text-format-wrapper:first');    if (!$wrapper.length) return;    $wrapper.find('.filter-guidelines-item:visible li').each(function(index, element) {      var expression = new RegExp(Drupal.t('Allowed HTML tags'));      if (expression.exec(element.textContent) && !element.textContent.match(/<img>/)) {        alert(Drupal.t("The selected text format will not allow it to display images. The text format will need to be changed for this image to display properly when saved."));      }    });  },  /**   * Insert content into a textarea at the current cursor position.   *   * @param editor   *   The DOM object of the textarea that will receive the text.   * @param content   *   The string to be inserted.   */  insertAtCursor: function(editor, content) {    // Record the current scroll position.    var scroll = editor.scrollTop;    // IE support.    if (document.selection) {      editor.focus();      sel = document.selection.createRange();      sel.text = content;    }    // Mozilla/Firefox/Netscape 7+ support.    else if (editor.selectionStart || editor.selectionStart == '0') {      var startPos = editor.selectionStart;      var endPos = editor.selectionEnd;      editor.value = editor.value.substring(0, startPos) + content + editor.value.substring(endPos, editor.value.length);    }    // Fallback, just add to the end of the content.    else {      editor.value += content;    }    // Ensure the textarea does not unexpectedly scroll.    editor.scrollTop = scroll;  }};})(jQuery);
 |