X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fjs%2Ffilefield_sources.js;fp=web%2Fmodules%2Fcontrib%2Ffilefield_sources%2Fjs%2Ffilefield_sources.js;h=1f66a3734da857779ffbd89667f3555111d29405;hp=0000000000000000000000000000000000000000;hb=8acec36f19c470dfcda1ae2336826a782f41874c;hpb=e0411c4e83ba0d079034db83c3f7f55be24a0e35 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 index 000000000..1f66a3734 --- /dev/null +++ b/web/modules/contrib/filefield_sources/js/filefield_sources.js @@ -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);