--- /dev/null
+/**
+ * @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);