Further modules included.
[yaffs-website] / web / modules / contrib / filefield_sources / js / filefield_sources.js
diff --git a/web/modules/contrib/filefield_sources/js/filefield_sources.js b/web/modules/contrib/filefield_sources/js/filefield_sources.js
new file mode 100644 (file)
index 0000000..1f66a37
--- /dev/null
@@ -0,0 +1,262 @@
+/**
+ * @file
+ * Defines Javascript behaviors for the filefield_sources module.
+ */
+
+(function ($, Drupal) {
+
+"use strict";
+
+// Behavior to add source options to configured fields.
+Drupal.behaviors.fileFieldSources = {};
+Drupal.behaviors.fileFieldSources.attach = function(context, settings) {
+  $('div.filefield-sources-list:not(.filefield-sources-processed)', context).each(function() {
+    $(this).addClass('filefield-sources-processed');
+    var $fileFieldElement = $(this).parents('div.form-managed-file:first');
+    $(this).find('a').click(function() {
+      // Remove the active class.
+      $(this).parents('div.filefield-sources-list').find('a.active').removeClass('active');
+
+      // Find the unique FileField Source class name.
+      var fileFieldSourceClass = this.className.match(/filefield-source-[0-9a-z_]+/i)[0];
+
+      // The default upload element is a special case.
+      if ($(this).is('.filefield-source-upload')) {
+        $fileFieldElement.find('div.filefield-sources-list').siblings('.form-file, .form-submit').css('display', '');
+        $fileFieldElement.find('div.filefield-source').css('display', 'none');
+      }
+      else {
+        $fileFieldElement.find('div.filefield-sources-list').siblings('.form-file, .form-submit').css('display', 'none');
+        $fileFieldElement.find('div.filefield-source').not('div.' + fileFieldSourceClass).css('display', 'none');
+        $fileFieldElement.find('div.' + fileFieldSourceClass).css('display', '');
+      }
+
+      // Add the active class.
+      $(this).addClass('active');
+      Drupal.fileFieldSources.updateHintText($fileFieldElement.get(0));
+    }).first().triggerHandler('click');
+
+    // Clipboard support.
+    $fileFieldElement.find('.filefield-source-clipboard-capture')
+      .bind('paste', Drupal.fileFieldSources.pasteEvent)
+      .bind('focus', Drupal.fileFieldSources.pasteFocus)
+      .bind('blur', Drupal.fileFieldSources.pasteBlur);
+
+    // Imce support.
+    $fileFieldElement.find('.filefield-sources-imce-browse')
+      .bind('click', Drupal.fileFieldSources.imceBrowse);
+  });
+
+  if (context === document) {
+    $('form').submit(function() {
+      Drupal.fileFieldSources.removeHintText();
+    });
+  }
+};
+
+// Helper functions used by FileField Sources.
+Drupal.fileFieldSources = {
+  /**
+   * Update the hint text when clicking between source types.
+   */
+  updateHintText: function(fileFieldElement) {
+    // Add default value hint text to text fields.
+    $(fileFieldElement).find('div.filefield-source').each(function() {
+      var matches = this.className.match(/filefield-source-([a-z]+)/);
+      var sourceType = matches[1];
+      var textfield = $(this).find('input.form-text:first').get(0);
+      var defaultText = (drupalSettings.fileFieldSources && drupalSettings.fileFieldSources[sourceType]) ? drupalSettings.fileFieldSources[sourceType].hintText : '';
+
+      // If the field doesn't exist, just return.
+      if (!textfield) {
+        return;
+      }
+
+      // If this field is not shown, remove its value and be done.
+      if (!$(this).is(':visible') && textfield.value == defaultText) {
+        textfield.value = '';
+        return;
+      }
+
+      // Set a default value:
+      if (textfield.value == '') {
+        textfield.value = defaultText;
+      }
+
+      // Set a default class.
+      if (textfield.value == defaultText) {
+        $(textfield).addClass('hint');
+      }
+
+      $(textfield).focus(hideHintText);
+      $(textfield).blur(showHintText);
+
+      function showHintText() {
+        if (this.value == '') {
+          this.value = defaultText;
+          $(this).addClass('hint');
+        }
+      }
+
+      function hideHintText() {
+        if (this.value == defaultText) {
+          this.value = '';
+          $(this).removeClass('hint');
+        }
+      }
+    });
+  },
+
+  /**
+   * Delete all hint text from a form before submit.
+   */
+  removeHintText: function() {
+    $('div.filefield-source input.hint').val('').removeClass('hint');
+  },
+
+  /**
+   * Clean up the default value on focus.
+   */
+  pasteFocus: function(e) {
+    // Set default text.
+    if (!this.defaultText) {
+      this.defaultText = this.innerHTML;
+      this.innerHTML = '';
+    }
+    // Remove non-text nodes.
+    $(this).children().remove();
+  },
+
+  /**
+   * Restore default value on blur.
+   */
+  pasteBlur: function(e) {
+    if (this.defaultText && !this.innerHTML) {
+      this.innerHTML = this.defaultText;
+    }
+  },
+
+  pasteEvent: function(e) {
+    var clipboardData = null;
+    var targetElement = this;
+    var userAgent = navigator.userAgent.toLowerCase();
+
+    // Chrome.
+    if (window.event && window.event.clipboardData && window.event.clipboardData.items) {
+      clipboardData = window.event.clipboardData;
+    }
+    // All browsers in the future (hopefully).
+    else if (e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.items) {
+      clipboardData = e.originalEvent.clipboardData;
+    }
+    // Firefox with content editable pastes as img tag with data href.
+    else if (userAgent.match(/mozilla/) && !userAgent.match(/webkit/)) {
+      Drupal.fileFieldSources.waitForPaste(targetElement);
+      return true;
+    }
+    else {
+      Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('Paste from clipboard not supported in this browser.'));
+      return false;
+    }
+
+    var items = clipboardData.items;
+    var types = clipboardData.types;
+    var filename = targetElement.firstChild ? targetElement.firstChild.textContent : '';
+
+    // Handle files and image content directly in the clipboard.
+    var fileFound = false;
+    for (var n = 0; n < items.length; n++) {
+      if (items[n] && items[n].kind === 'file') {
+        var fileBlob = items[n].getAsFile();
+        var fileReader = new FileReader();
+        // Define events to fire after the file is read into memory.
+        fileReader.onload = function() {
+          Drupal.fileFieldSources.pasteSubmit(targetElement, filename, this.result);
+        };
+        fileReader.onerror = function() {
+          Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('Error reading file from clipboard.'));
+        };
+        // Read in the file to fire the above events.
+        fileReader.readAsDataURL(fileBlob);
+        fileFound = true;
+        break;
+      }
+      // Handle files that a copy/pasted as a file reference.
+      /* if (types[n] && types[n] === 'Files') {
+          TODO: Figure out how to capture copy/paste of entire files from desktop.
+       }*/
+    }
+    if (!fileFound) {
+      Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('No file in clipboard.'));
+    }
+    return false;
+  },
+
+  /**
+   * For browsers that don't support native clipboardData attributes.
+   */
+  waitForPaste: function(targetElement) {
+    if (targetElement.children && targetElement.children.length > 0) {
+      var filename = targetElement.firstChild ? targetElement.firstChild.textContent : '';
+      var tagFound = false;
+      $(targetElement).find('img[src^="data:image"]').each(function(n, element) {
+        Drupal.fileFieldSources.pasteSubmit(targetElement, filename, element.src);
+        tagFound = true;
+      });
+      $(targetElement).html(filename);
+      if (!tagFound) {
+        Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('No file in clipboard.'));
+      }
+    }
+    else {
+      setTimeout(function() {
+        Drupal.fileFieldSources.waitForPaste(targetElement);
+      }, 200);
+    }
+  },
+
+  /**
+   * Set an error on the paste field temporarily then clear it.
+   */
+  pasteError: function(domElement, errorMessage) {
+    var $description = $(domElement).parents('.filefield-source-clipboard:first').find('.description');
+    if (!$description.data('originalDescription')) {
+      $description.data('originalDescription', $description.html())
+    }
+    $description.html(errorMessage);
+    var errorTimeout = setTimeout(function() {
+      $description.html($description.data('originalDescription'));
+      $(this).unbind('click.pasteError');
+    }, 3000);
+    $(domElement).bind('click.pasteError', function() {
+      clearTimeout(errorTimeout);
+      $description.html($description.data('originalDescription'));
+      $(this).unbind('click.pasteError');
+    });
+  },
+
+  /**
+   * After retreiving a clipboard, post the results to the server.
+   */
+  pasteSubmit: function(targetElement, filename, contents) {
+    var $wrapper = $(targetElement).parents('.filefield-source-clipboard');
+    $wrapper.find('.filefield-source-clipboard-filename').val(filename);
+    $wrapper.find('.filefield-source-clipboard-contents').val(contents);
+    $wrapper.find('input.form-submit').trigger('mousedown');
+  },
+
+  /**
+   * Click event for the imce browse link.
+   */
+  imceBrowse: function (e) {
+    window.open(this.href, '', 'width=760,height=560,resizable=1');
+    e.preventDefault();
+  }
+};
+
+// Override triggerUploadButton method from file.js.
+Drupal.file.triggerUploadButton = function (event) {
+  $(event.target).closest('.form-managed-file').find('.form-submit.upload-button').trigger('mousedown');
+}
+
+})(jQuery, Drupal);