From a52382ad8b2769ed465caf6b56b0d76b550e1120 Mon Sep 17 00:00:00 2001 From: "vit.jonas@gmail.com" Date: Thu, 6 Oct 2011 08:14:09 +0000 Subject: [PATCH] * fixed Issue 157: Upload area tagging file names with 'undefined' and refusing to upload. * updated plupload to 1.5.1.1 git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@248 5e329b0b-a2ee-ea63-e329-299493fc886d --- assets/javascripts/plupload/i18n/fi.js | 33 + assets/javascripts/plupload/i18n/ja.js | 62 +- assets/javascripts/plupload/i18n/lv.js | 2 +- assets/javascripts/plupload/i18n/pt-br.js | 2 +- .../jquery.ui.plupload/jquery.ui.plupload.js | 49 +- .../plupload/plupload.browserplus.js | 337 ----------- assets/javascripts/plupload/plupload.flash.js | 57 +- .../javascripts/plupload/plupload.flash.swf | Bin 18538 -> 18752 bytes assets/javascripts/plupload/plupload.gears.js | 420 ------------- assets/javascripts/plupload/plupload.html4.js | 50 +- assets/javascripts/plupload/plupload.html5.js | 567 ++++++++++-------- assets/javascripts/plupload/plupload.js | 61 +- .../plupload/plupload.silverlight.js | 13 +- .../plupload/plupload.silverlight.xap | Bin 43337 -> 43675 bytes 14 files changed, 538 insertions(+), 1115 deletions(-) create mode 100644 assets/javascripts/plupload/i18n/fi.js delete mode 100644 assets/javascripts/plupload/plupload.browserplus.js delete mode 100644 assets/javascripts/plupload/plupload.gears.js diff --git a/assets/javascripts/plupload/i18n/fi.js b/assets/javascripts/plupload/i18n/fi.js new file mode 100644 index 00000000..12a639ef --- /dev/null +++ b/assets/javascripts/plupload/i18n/fi.js @@ -0,0 +1,33 @@ +// .fi file like language pack +plupload.addI18n({ + 'Select files' : 'Valitse tiedostoja', + 'Add files to the upload queue and click the start button.' : 'Lisää tiedostoja latausjonoon ja klikkaa aloita-nappia.', + 'Filename' : 'Tiedostonimi', + 'Status' : 'Tila', + 'Size' : 'Koko', + 'Add files' : 'Lisää tiedostoja', + 'Stop current upload' : 'Pysäytä nykyinen lataus', + 'Start uploading queue' : 'Aloita jonon lataus', + 'Drag files here.' : 'Raahaa tiedostot tänne.', + 'Start upload' : 'Aloita lataus', + 'Uploaded %d/%d files': 'Ladattu %d/%d tiedostoa', + 'Stop upload': 'Pysäytä lataus', + 'Start upload': 'Aloita lataus', + '%d files queued': '%d tiedostoa jonossa', + 'File: %s': 'Tiedosto: %s', + 'Close': 'Sulje', + 'Using runtime: ': 'Käytetään ajonaikaista: ', + 'File: %f, size: %s, max file size: %m': 'Tiedosto: %f, koko: %s, maksimi tiedostokoko: %m', + 'Upload element accepts only %d file(s) at a time. Extra files were stripped.': 'Latauselementti sallii ladata vain %d tiedosto(a) kerrallaan. Ylimääräiset tiedostot ohitettiin.', + 'Upload URL might be wrong or doesn\'t exist': 'Lataus URL saattaa olla väärin tai ei ole olemassa', + 'Error: File too large: ': 'Virhe: Tiedosto liian suuri: ', + 'Error: Invalid file extension: ': 'Virhe: Kelpaamaton tiedostopääte: ', + 'File extension error.': 'Tiedostopäätevirhe.', + 'File size error.': 'Tiedostokokovirhe.', + 'File count error.': 'Tiedostolaskentavirhe.', + 'Init error.': 'Init virhe.', + 'HTTP Error.': 'HTTP virhe.', + 'Security error.': 'Tietoturvavirhe.', + 'Generic error.': 'Yleinen virhe.', + 'IO error.': 'I/O virhe.' +}); \ No newline at end of file diff --git a/assets/javascripts/plupload/i18n/ja.js b/assets/javascripts/plupload/i18n/ja.js index c70773cf..02c85aee 100644 --- a/assets/javascripts/plupload/i18n/ja.js +++ b/assets/javascripts/plupload/i18n/ja.js @@ -1,25 +1,37 @@ -// Japanese -plupload.addI18n({ - 'Select files' : 'ファイルの選択:', - 'Add files to the upload queue and click the start button.' : 'アップロードキューにファイルを追加しスタートボタンをクリックしてください。', - 'Filename' : 'ファイル名', - 'Status' : '進行状況', - 'Size' : 'サイズ', - 'Add files' : 'ファイルの追加', - 'Stop current upload' : '現在のアップロードを中止', - 'Start uploading queue' : 'キューのアップロードを開始', - 'Uploaded %d/%d files': '%d/%d 個のファイルをアップロードしました', - 'N/A' : 'N/A', - 'Drag files here.' : 'ここにファイルをドラッグしてください。', - 'File extension error.': 'ファイル拡張子エラーです。', - 'File size error.': 'ファイルサイズエラーです。', - 'Init error.': '初期化エラーです。', - 'HTTP Error.': 'HTTP エラーです。', - 'Security error.': 'セキュリティエラーです。', - 'Generic error.': '原因不明のエラーです。', - 'IO error.': 'I/O エラーです。', - 'Stop Upload': 'アップロードの中止', - 'Add Files': 'ファイルの追加', - 'Start Upload': 'アップロードの開始', - '%d files queued': '%d 個のファイルがキューにあります。' -}); \ No newline at end of file +// Japanese +plupload.addI18n({ + 'Select files' : 'ファイル選択', + 'Add files to the upload queue and click the start button.' : 'ファイルをアップロードキューに追加してスタートボタンをクリックしてください', + 'Filename' : 'ファイル名', + 'Status' : 'ステータス', + 'Size' : 'サイズ', + 'Add Files' : 'ファイルを追加', + 'Stop Upload' : 'アップロード停止', + 'Start Upload' : 'アップロード', + 'Add files' : 'ファイルを追加', + 'Add files.' : 'ファイルを追加', + 'Stop current upload' : '現在のアップロードを停止', + 'Start uploading queue' : 'アップロード', + 'Stop upload' : 'アップロード停止', + 'Start upload' : 'アップロード', + 'Uploaded %d/%d files': 'アップロード中 %d/%d ファイル', + 'N/A' : 'N/A', + 'Drag files here.' : 'ここにファイルをドラッグ', + 'File extension error.': 'ファイル拡張子エラー', + 'File size error.': 'ファイルサイズエラー', + 'File count error.': 'ファイル数エラー', + 'Init error.': 'イニシャライズエラー', + 'HTTP Error.': 'HTTP エラー', + 'Security error.': 'セキュリティエラー', + 'Generic error.': 'エラー', + 'IO error.': 'IO エラー', + 'File: %s': 'ファイル: %s', + 'Close': '閉じる', + '%d files queued': '%d ファイルが追加されました', + 'Using runtime: ': 'モード: ', + 'File: %f, size: %s, max file size: %m': 'ファイル: %f, サイズ: %s, 最大ファイルサイズ: %m', + 'Upload element accepts only %d file(s) at a time. Extra files were stripped.': 'アップロード可能なファイル数は %d です。余分なファイルは削除されました', + 'Upload URL might be wrong or doesn\'t exist': 'アップロード先の URL が存在しません', + 'Error: File too large: ': 'エラー: サイズが大きすぎます: ', + 'Error: Invalid file extension: ': 'エラー: 拡張子が許可されていません: ' +}); diff --git a/assets/javascripts/plupload/i18n/lv.js b/assets/javascripts/plupload/i18n/lv.js index 21eda086..2a040452 100644 --- a/assets/javascripts/plupload/i18n/lv.js +++ b/assets/javascripts/plupload/i18n/lv.js @@ -20,7 +20,7 @@ plupload.addI18n({ 'File: %f, size: %s, max file size: %m': 'Fails: %f, izmērs: %s, maksimālais faila izmērs: %m', 'Upload element accepts only %d file(s) at a time. Extra files were stripped.': 'Iespējams ielādēt tikai %d failus vienā reizē. Atlikušie faili netika pievienoti', 'Upload URL might be wrong or doesn\'t exist': 'Augšupielādes URL varētu būt nepareizs vai neeksistē', - 'Error: File to large: ': 'Kļūda: Fails pārāk liels: ', + 'Error: File too large: ': 'Kļūda: Fails pārāk liels: ', 'Error: Invalid file extension: ': 'Kļūda: Nekorekts faila paplašinājums:', 'File extension error.': 'Faila paplašinājuma kļūda.', 'File size error.': 'Faila izmēra kļūda.', diff --git a/assets/javascripts/plupload/i18n/pt-br.js b/assets/javascripts/plupload/i18n/pt-br.js index bd696d3f..9f34a64a 100644 --- a/assets/javascripts/plupload/i18n/pt-br.js +++ b/assets/javascripts/plupload/i18n/pt-br.js @@ -30,6 +30,6 @@ plupload.addI18n({ 'File: %f, size: %s, max file size: %m': 'Arquivo: %f, tamanho: %s, máximo: %m', 'Upload element accepts only %d file(s) at a time. Extra files were stripped.': 'Só são aceitos %d arquivos por vez. O que passou disso foi descartado.', 'Upload URL might be wrong or doesn\'t exist': 'URL de envio está errada ou não existe', - 'Error: File to large: ': 'Erro: Arquivo muito grande: ', + 'Error: File too large: ': 'Erro: Arquivo muito grande: ', 'Error: Invalid file extension: ': 'Erro: Tipo de arquivo não permitido: ' }); diff --git a/assets/javascripts/plupload/jquery.ui.plupload/jquery.ui.plupload.js b/assets/javascripts/plupload/jquery.ui.plupload/jquery.ui.plupload.js index 60802d81..680ffec8 100644 --- a/assets/javascripts/plupload/jquery.ui.plupload/jquery.ui.plupload.js +++ b/assets/javascripts/plupload/jquery.ui.plupload/jquery.ui.plupload.js @@ -37,7 +37,7 @@ function renderUI(obj) { '
' + '
' + '' + - + '
' + '' + '' + @@ -133,7 +133,11 @@ $.widget("ui.plupload", { this.container = $('.plupload_container', this.element).attr('id', id + '_container'); // list of files, may become sortable - this.filelist = $('.plupload_filelist_content', this.container).attr('id', id + '_filelist'); + this.filelist = $('.plupload_filelist_content', this.container) + .attr({ + id: id + '_filelist', + unselectable: 'on' + }); // buttons this.browse_button = $('.plupload_add', this.container).attr('id', id + '_browse'); @@ -217,12 +221,12 @@ $.widget("ui.plupload", { // check if file count doesn't exceed the limit if (self.options.max_file_count) { - uploader.bind('FilesAdded', function(up, files) { - var length = files.length, removed = []; - length += up.files.length; + uploader.bind('FilesAdded', function(up, selectedFiles) { + var removed = [], selectedCount = selectedFiles.length; + var extraCount = up.files.length + selectedCount - self.options.max_file_count; - if (length > self.options.max_file_count) { - removed = files.splice(self.options.max_file_count - up.files.length); + if (extraCount > 0) { + removed = selectedFiles.splice(selectedCount - extraCount, extraCount); up.trigger('Error', { code : self.FILE_COUNT_ERROR, @@ -336,7 +340,7 @@ $.widget("ui.plupload", { message += "
" + details + ""; } - self._notify('error', message); + self.notify('error', message); self._trigger('error', null, { up: up, file: file, error: message } ); } }); @@ -651,24 +655,12 @@ $.widget("ui.plupload", { return el.clone(true).find('td:not(.plupload_file_name)').remove().end().css('width', '100%'); }, - start: function(e, ui) { - idxStart = $('tr', this).index(ui.item); - }, - stop: function(e, ui) { - var i, length, idx, files = [], idxStop = $('tr', this).index(ui.item); - - for (i = 0, length = self.uploader.files.length; i < length; i++) { - - if (i === idxStop) { - idx = idxStart; - } else if (i === idxStart) { - idx = idxStop; - } else { - idx = i; - } - files[files.length] = self.uploader.files[idx]; - } + var i, length, idx, files = []; + + $.each($(this).sortable('toArray'), function(i, id) { + files[files.length] = self.uploader.getFile(id); + }); files.unshift(files.length); files.unshift(0); @@ -679,7 +671,7 @@ $.widget("ui.plupload", { }); }, - _notify: function(type, message) { + notify: function(type, message) { var popup = $( '
' + '' + @@ -696,8 +688,9 @@ $.widget("ui.plupload", { .click(function() { popup.remove(); }) - .end() - .appendTo('.plupload_header_content', this.container); + .end(); + + $('.plupload_header_content', this.container).append(popup); }, diff --git a/assets/javascripts/plupload/plupload.browserplus.js b/assets/javascripts/plupload/plupload.browserplus.js deleted file mode 100644 index d1be1b7a..00000000 --- a/assets/javascripts/plupload/plupload.browserplus.js +++ /dev/null @@ -1,337 +0,0 @@ -/** - * plupload.browserplus.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under GPL License. - * - * License: http://www.plupload.com/license - * Contributing: http://www.plupload.com/contributing - */ - -// JSLint defined globals -/*global plupload:false, BrowserPlus:false, window:false */ - -(function(plupload) { - /** - * Yahoo BrowserPlus implementation. This runtime supports these features: dragdrop, jpgresize, pngresize. - * - * @static - * @class plupload.runtimes.BrowserPlus - * @extends plupload.Runtime - */ - plupload.runtimes.BrowserPlus = plupload.addRuntime("browserplus", { - /** - * Returns a list of supported features for the runtime. - * - * @return {Object} Name/value object with supported features. - */ - getFeatures : function() { - return { - dragdrop : true, - jpgresize : true, - pngresize : true, - chunks : true, - progress: true, - multipart: true - }; - }, - - /** - * Initializes the browserplus runtime. - * - * @method init - * @param {plupload.Uploader} uploader Uploader instance that needs to be initialized. - * @param {function} callback Callback to execute when the runtime initializes or fails to initialize. If it succeeds an object with a parameter name success will be set to true. - */ - init : function(uploader, callback) { - var browserPlus = window.BrowserPlus, browserPlusFiles = {}, settings = uploader.settings, resize = settings.resize; - - function addSelectedFiles(native_files) { - var files, i, selectedFiles = [], file, id; - - // Add the native files and setup plupload files - for (i = 0; i < native_files.length; i++) { - file = native_files[i]; - id = plupload.guid(); - browserPlusFiles[id] = file; - - selectedFiles.push(new plupload.File(id, file.name, file.size)); - } - - // Any files selected fire event - if (i) { - uploader.trigger("FilesAdded", selectedFiles); - } - } - - // Setup event listeners if browserplus was initialized - function setup() { - // Add drop handler - uploader.bind("PostInit", function() { - var dropTargetElm, dropElmId = settings.drop_element, - dropTargetId = uploader.id + '_droptarget', - dropElm = document.getElementById(dropElmId), - lastState; - - // Enable/disable drop support for the drop target - // this is needed to resolve IE bubbeling issues and make it possible to drag/drop - // files into gears runtimes on the same page - function addDropHandler(id, end_callback) { - // Add drop target and listener - browserPlus.DragAndDrop.AddDropTarget({id : id}, function(res) { - browserPlus.DragAndDrop.AttachCallbacks({ - id : id, - hover : function(res) { - if (!res && end_callback) { - end_callback(); - } - }, - drop : function(res) { - if (end_callback) { - end_callback(); - } - - addSelectedFiles(res); - } - }, function() { - }); - }); - } - - function hide() { - document.getElementById(dropTargetId).style.top = '-1000px'; - } - - if (dropElm) { - // Since IE has issues with bubbeling when it comes to the drop of files - // we need to do this hack where we show a drop target div element while dropping - if (document.attachEvent && (/MSIE/gi).test(navigator.userAgent)) { - // Create drop target - dropTargetElm = document.createElement('div'); - dropTargetElm.setAttribute('id', dropTargetId); - plupload.extend(dropTargetElm.style, { - position : 'absolute', - top : '-1000px', - background : 'red', - filter : 'alpha(opacity=0)', - opacity : 0 - }); - - document.body.appendChild(dropTargetElm); - - plupload.addEvent(dropElm, 'dragenter', function(e) { - var dropElm, dropElmPos; - - dropElm = document.getElementById(dropElmId); - dropElmPos = plupload.getPos(dropElm); - - plupload.extend(document.getElementById(dropTargetId).style, { - top : dropElmPos.y + 'px', - left : dropElmPos.x + 'px', - width : dropElm.offsetWidth + 'px', - height : dropElm.offsetHeight + 'px' - }); - }); - - addDropHandler(dropTargetId, hide); - } else { - addDropHandler(dropElmId); - } - } - - plupload.addEvent(document.getElementById(settings.browse_button), 'click', function(e) { - var mimeTypes = [], i, a, filters = settings.filters, ext; - - e.preventDefault(); - - // Convert extensions to mimetypes - for (i = 0; i < filters.length; i++) { - ext = filters[i].extensions.split(','); - - for (a = 0; a < ext.length; a++) { - mimeTypes.push(plupload.mimeTypes[ext[a]]); - } - } - - browserPlus.FileBrowse.OpenBrowseDialog({ - mimeTypes : mimeTypes - }, function(res) { - if (res.success) { - addSelectedFiles(res.value); - } - }); - }); - - // Prevent IE leaks - dropElm = dropTargetElm = null; - }); - - uploader.bind("UploadFile", function(up, file) { - var nativeFile = browserPlusFiles[file.id], reqParams = {}, - chunkSize = up.settings.chunk_size, loadProgress, chunkStack = []; - - function uploadFile(chunk, chunks) { - var chunkFile; - - // Stop upload if file is maked as failed - if (file.status == plupload.FAILED) { - return; - } - - reqParams.name = file.target_name || file.name; - - // Only send chunk parameters if chunk size is defined - if (chunkSize) { - reqParams.chunk = "" + chunk; - reqParams.chunks = "" + chunks; - } - - chunkFile = chunkStack.shift(); - - browserPlus.Uploader.upload({ - url : up.settings.url, - files : {file : chunkFile}, - cookies : document.cookies, - postvars : plupload.extend(reqParams, up.settings.multipart_params), - progressCallback : function(res) { - var i, loaded = 0; - - // since more than 1 chunk can be sent at a time, keep track of how many bytes - // of each chunk was sent - loadProgress[chunk] = parseInt(res.filePercent * chunkFile.size / 100, 10); - for (i = 0; i < loadProgress.length; i++) { - loaded += loadProgress[i]; - } - - file.loaded = loaded; - up.trigger('UploadProgress', file); - } - }, function(res) { - var httpStatus, chunkArgs; - - if (res.success) { - httpStatus = res.value.statusCode; - - if (chunkSize) { - up.trigger('ChunkUploaded', file, { - chunk : chunk, - chunks : chunks, - response : res.value.body, - status : httpStatus - }); - } - - if (chunkStack.length > 0) { - // More chunks to be uploaded - uploadFile(++chunk, chunks); - } else { - file.status = plupload.DONE; - - up.trigger('FileUploaded', file, { - response : res.value.body, - status : httpStatus - }); - - // Is error status - if (httpStatus >= 400) { - up.trigger('Error', { - code : plupload.HTTP_ERROR, - message : plupload.translate('HTTP Error.'), - file : file, - status : httpStatus - }); - } - } - } else { - up.trigger('Error', { - code : plupload.GENERIC_ERROR, - message : plupload.translate('Generic Error.'), - file : file, - details : res.error - }); - } - }); - } - - function chunkAndUploadFile(native_file) { - file.size = native_file.size; - if (chunkSize) { - browserPlus.FileAccess.chunk({file : native_file, chunkSize : chunkSize}, function(cr) { - if (cr.success) { - var chunks = cr.value, len = chunks.length; - - loadProgress = Array(len); - - for (var i = 0; i < len; i++) { - loadProgress[i] = 0; - chunkStack.push(chunks[i]); - } - - uploadFile(0, len); - } - }); - } else { - loadProgress = Array(1); - chunkStack.push(native_file); - uploadFile(0, 1); - } - } - - // Resize image if it's a supported format and resize is enabled - if (resize && /\.(png|jpg|jpeg)$/i.test(file.name)) { - BrowserPlus.ImageAlter.transform({ - file : nativeFile, - quality : resize.quality || 90, - actions : [{ - scale : { - maxwidth : resize.width, - maxheight : resize.height - } - }] - }, function(res) { - if (res.success) { - chunkAndUploadFile(res.value.file); - } - }); - } else { - chunkAndUploadFile(nativeFile); - } - }); - - callback({success : true}); - } - - // Check for browserplus object - if (browserPlus) { - browserPlus.init(function(res) { - var services = [ - {service: "Uploader", version: "3"}, - {service: "DragAndDrop", version: "1"}, - {service: "FileBrowse", version: "1"}, - {service: "FileAccess", version: "2"} - ]; - - if (resize) { - services.push({service : 'ImageAlter', version : "4"}); - } - - if (res.success) { - browserPlus.require({ - services : services - }, function(sres) { - if (sres.success) { - setup(); - } else { - callback(); - } - }); - } else { - callback(); - } - }); - } else { - callback(); - } - } - }); -})(plupload); diff --git a/assets/javascripts/plupload/plupload.flash.js b/assets/javascripts/plupload/plupload.flash.js index 28941d97..a5d08b10 100644 --- a/assets/javascripts/plupload/plupload.flash.js +++ b/assets/javascripts/plupload/plupload.flash.js @@ -42,7 +42,7 @@ * @param {Object} obj Parameters to be passed with event. */ trigger : function(id, name, obj) { - + // Detach the call so that error handling in the browser is presented correctly setTimeout(function() { var uploader = uploadInstances[id], i, args; @@ -76,7 +76,8 @@ maxHeight: 8091, chunks: true, progress: true, - multipart: true + multipart: true, + multi_selection: true }; }, @@ -88,12 +89,7 @@ * @param {function} callback Callback to execute when the runtime initializes or fails to initialize. If it succeeds an object with a parameter name success will be set to true. */ init : function(uploader, callback) { - var browseButton, flashContainer, flashVars, waitCount = 0, container = document.body; - - if (bowser.opera) { - callback({success : false}); - return; - } + var browseButton, flashContainer, waitCount = 0, container = document.body; if (getFlashVersion() < 10) { callback({success : false}); @@ -129,15 +125,33 @@ } container.appendChild(flashContainer); + + // insert flash object + (function() { + var html, el; + + html = '' + - '' + - '' + - '' + - ''; + html += 'width="100%" height="100%" style="outline:0">' + + '' + + '' + + '' + + '' + + ''; + + if (plupload.ua.ie) { + el = document.createElement('div'); + flashContainer.appendChild(el); + el.outerHTML = html; + el = null; // just in case + } else { + flashContainer.innerHTML = html; + } + }()); function getFlashObj() { return document.getElementById(uploader.id + '_flash'); @@ -334,6 +348,17 @@ plupload.removeClass(browseButton, activeClass); } }); + + + uploader.bind('Flash:ExifData', function(up, obj) { + uploader.trigger('ExifData', uploader.getFile(lookup[obj.id]), obj.data); + }); + + + uploader.bind('Flash:GpsData', function(up, obj) { + uploader.trigger('GpsData', uploader.getFile(lookup[obj.id]), obj.data); + }); + uploader.bind("QueueChanged", function(up) { uploader.refresh(); diff --git a/assets/javascripts/plupload/plupload.flash.swf b/assets/javascripts/plupload/plupload.flash.swf index 7a1a9370abac19b08c9ec82da44118ebf86fa6e8..36460568b72f5fd5f9d592b170105e3c104bd3ba 100644 GIT binary patch literal 18752 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 literal 18538 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 diff --git a/assets/javascripts/plupload/plupload.gears.js b/assets/javascripts/plupload/plupload.gears.js deleted file mode 100644 index a2738538..00000000 --- a/assets/javascripts/plupload/plupload.gears.js +++ /dev/null @@ -1,420 +0,0 @@ -/** - * plupload.gears.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under GPL License. - * - * License: http://www.plupload.com/license - * Contributing: http://www.plupload.com/contributing - */ - -// JSLint defined globals -/*global window:false, document:false, plupload:false, google:false, GearsFactory:false, ActiveXObject:false */ - -// Copyright 2007, Google Inc. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Sets up google.gears.*, which is *the only* supported way to access Gears. -// -// Circumvent this file at your own risk! -// -// In the future, Gears may automatically define google.gears.* without this -// file. Gears may use these objects to transparently fix bugs and compatibility -// issues. Applications that use the code below will continue to work seamlessly -// when that happens. - -(function() { - // We are already defined. Hooray! - if (window.google && google.gears) { - return; - } - - var factory = null; - - // Firefox - if (typeof GearsFactory != 'undefined') { - factory = new GearsFactory(); - } else { - // IE - try { - factory = new ActiveXObject('Gears.Factory'); - // privateSetGlobalObject is only required and supported on WinCE. - if (factory.getBuildInfo().indexOf('ie_mobile') != -1) { - factory.privateSetGlobalObject(this); - } - } catch (e) { - // Safari - if ((typeof navigator.mimeTypes != 'undefined') && navigator.mimeTypes["application/x-googlegears"]) { - factory = document.createElement("object"); - factory.style.display = "none"; - factory.width = 0; - factory.height = 0; - factory.type = "application/x-googlegears"; - document.documentElement.appendChild(factory); - } - } - } - - // *Do not* define any objects if Gears is not installed. This mimics the - // behavior of Gears defining the objects in the future. - if (!factory) { - return; - } - - // Now set up the objects, being careful not to overwrite anything. - // - // Note: In Internet Explorer for Windows Mobile, you can't add properties to - // the window object. However, global objects are automatically added as - // properties of the window object in all browsers. - if (!window.google) { - window.google = {}; - } - - if (!google.gears) { - google.gears = {factory: factory}; - } -})(); - -(function(window, document, plupload, undef) { - var blobs = {}; - - function scaleImage(image_blob, resize, mime) { - var percentage, canvas, context, scale; - - // Setup canvas and scale - canvas = google.gears.factory.create('beta.canvas'); - try { - canvas.decode(image_blob); - - if (!resize['width']) { - resize['width'] = canvas.width; - } - - if (!resize['height']) { - resize['height'] = canvas.height; - } - - scale = Math.min(width / canvas.width, height / canvas.height); - - if (scale < 1 || (scale === 1 && mime === 'image/jpeg')) { - canvas.resize(Math.round(canvas.width * scale), Math.round(canvas.height * scale)); - - if (resize['quality']) { - return canvas.encode(mime, {quality : resize.quality / 100}); - } - - return canvas.encode(mime); - } - } catch (e) { - // Ignore for example when a user uploads a file that can't be decoded - } - - return image_blob; - } - - /** - * Gears implementation. This runtime supports these features: dragdrop, jpgresize, pngresize, chunks. - * - * @static - * @class plupload.runtimes.Gears - * @extends plupload.Runtime - */ - plupload.runtimes.Gears = plupload.addRuntime("gears", { - /** - * Returns a list of supported features for the runtime. - * - * @return {Object} Name/value object with supported features. - */ - getFeatures : function() { - return { - dragdrop: true, - jpgresize: true, - pngresize: true, - chunks: true, - progress: true, - multipart: true - }; - }, - - /** - * Initializes the upload runtime. - * - * @method init - * @param {plupload.Uploader} uploader Uploader instance that needs to be initialized. - * @param {function} callback Callback to execute when the runtime initializes or fails to initialize. If it succeeds an object with a parameter name success will be set to true. - */ - init : function(uploader, callback) { - var desktop; - - // Check for gears support - if (!window.google || !google.gears) { - return callback({success : false}); - } - - try { - desktop = google.gears.factory.create('beta.desktop'); - } catch (e) { - // Might fail on the latest Gecko build for some odd reason - return callback({success : false}); - } - - function addSelectedFiles(selected_files) { - var file, i, files = [], id; - - // Add the selected files to the file queue - for (i = 0; i < selected_files.length; i++) { - file = selected_files[i]; - - // Store away gears blob internally - id = plupload.guid(); - blobs[id] = file.blob; - - files.push(new plupload.File(id, file.name, file.blob.length)); - } - - // Fire FilesAdded event - uploader.trigger("FilesAdded", files); - } - - // Add drop handler - uploader.bind("PostInit", function() { - var settings = uploader.settings, dropElm = document.getElementById(settings.drop_element); - - if (dropElm) { - // Block browser default drag over - plupload.addEvent(dropElm, 'dragover', function(e) { - desktop.setDropEffect(e, 'copy'); - e.preventDefault(); - }, uploader.id); - - // Attach drop handler and grab files from Gears - plupload.addEvent(dropElm, 'drop', function(e) { - var dragData = desktop.getDragData(e, 'application/x-gears-files'); - - if (dragData) { - addSelectedFiles(dragData.files); - } - - e.preventDefault(); - }, uploader.id); - - // Prevent IE leak - dropElm = 0; - } - - // Add browse button - plupload.addEvent(document.getElementById(settings.browse_button), 'click', function(e) { - var filters = [], i, a, ext; - - e.preventDefault(); - - for (i = 0; i < settings.filters.length; i++) { - ext = settings.filters[i].extensions.split(','); - - for (a = 0; a < ext.length; a++) { - filters.push('.' + ext[a]); - } - } - - desktop.openFiles(addSelectedFiles, {singleFile : !settings.multi_selection, filter : filters}); - }, uploader.id); - }); - - uploader.bind("UploadFile", function(up, file) { - var chunk = 0, chunks, chunkSize, loaded = 0, resize = up.settings.resize, chunking; - - // If file is png or jpeg and resize is configured then resize it - if (resize && /\.(png|jpg|jpeg)$/i.test(file.name)) { - blobs[file.id] = scaleImage(blobs[file.id], resize, /\.png$/i.test(file.name) ? 'image/png' : 'image/jpeg'); - } - - file.size = blobs[file.id].length; - - chunkSize = up.settings.chunk_size; - chunking = chunkSize > 0; - chunks = Math.ceil(file.size / chunkSize); - - // If chunking is disabled then upload the whole file in one huge chunk - if (!chunking) { - chunkSize = file.size; - chunks = 1; - } - - function uploadNextChunk() { - var req, curChunkSize, multipart = up.settings.multipart, multipartLength = 0, reqArgs = {name : file.target_name || file.name}, url = up.settings.url; - - // Sends the binary blob multipart encoded or raw depending on config - function sendBinaryBlob(blob) { - var builder, boundary = '----pluploadboundary' + plupload.guid(), dashdash = '--', crlf = '\r\n', multipartBlob, mimeType; - - // Build multipart request - if (multipart) { - req.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); - builder = google.gears.factory.create('beta.blobbuilder'); - - // Append mutlipart parameters - plupload.each(plupload.extend(reqArgs, up.settings.multipart_params), function(value, name) { - builder.append( - dashdash + boundary + crlf + - 'Content-Disposition: form-data; name="' + name + '"' + crlf + crlf - ); - - builder.append(value + crlf); - }); - - mimeType = plupload.mimeTypes[file.name.replace(/^.+\.([^.]+)/, '$1').toLowerCase()] || 'application/octet-stream'; - - // Add file header - builder.append( - dashdash + boundary + crlf + - 'Content-Disposition: form-data; name="' + up.settings.file_data_name + '"; filename="' + file.name + '"' + crlf + - 'Content-Type: ' + mimeType + crlf + crlf - ); - - // Add file data - builder.append(blob); - - // Add footer - builder.append(crlf + dashdash + boundary + dashdash + crlf); - multipartBlob = builder.getAsBlob(); - multipartLength = multipartBlob.length - blob.length; - blob = multipartBlob; - } - - // Send blob or multipart blob depending on config - req.send(blob); - } - - // File upload finished - if (file.status == plupload.DONE || file.status == plupload.FAILED || up.state == plupload.STOPPED) { - return; - } - - // Only add chunking args if needed - if (chunking) { - reqArgs.chunk = chunk; - reqArgs.chunks = chunks; - } - - // Setup current chunk size - curChunkSize = Math.min(chunkSize, file.size - (chunk * chunkSize)); - - if (!multipart) { - url = plupload.buildUrl(up.settings.url, reqArgs); - } - - req = google.gears.factory.create('beta.httprequest'); - req.open('POST', url); - - // Add disposition and type if multipart is disabled - if (!multipart) { - req.setRequestHeader('Content-Disposition', 'attachment; filename="' + file.name + '"'); - req.setRequestHeader('Content-Type', 'application/octet-stream'); - } - - // Set custom headers - plupload.each(up.settings.headers, function(value, name) { - req.setRequestHeader(name, value); - }); - - req.upload.onprogress = function(progress) { - file.loaded = loaded + progress.loaded - multipartLength; - up.trigger('UploadProgress', file); - }; - - req.onreadystatechange = function() { - var chunkArgs; - - if (req.readyState == 4) { - if (req.status == 200) { - chunkArgs = { - chunk : chunk, - chunks : chunks, - response : req.responseText, - status : req.status - }; - - up.trigger('ChunkUploaded', file, chunkArgs); - - // Stop upload - if (chunkArgs.cancelled) { - file.status = plupload.FAILED; - return; - } - - loaded += curChunkSize; - - if (++chunk >= chunks) { - file.status = plupload.DONE; - up.trigger('FileUploaded', file, { - response : req.responseText, - status : req.status - }); - } else { - uploadNextChunk(); - } - } else { - up.trigger('Error', { - code : plupload.HTTP_ERROR, - message : plupload.translate('HTTP Error.'), - file : file, - chunk : chunk, - chunks : chunks, - status : req.status - }); - } - } - }; - - if (chunk < chunks) { - sendBinaryBlob(blobs[file.id].slice(chunk * chunkSize, curChunkSize)); - } - } - - // Start uploading chunks - uploadNextChunk(); - }); - - uploader.bind("Destroy", function(up) { - var name, element, - elements = { - browseButton: up.settings.browse_button, - dropElm: up.settings.drop_element - }; - - // Unbind event handlers - for (name in elements) { - element = document.getElementById(elements[name]); - if (element) { - plupload.removeAllEvents(element, up.id); - } - } - }); - - - callback({success : true}); - } - }); -})(window, document, plupload); diff --git a/assets/javascripts/plupload/plupload.html4.js b/assets/javascripts/plupload/plupload.html4.js index 7c470b85..087002c1 100644 --- a/assets/javascripts/plupload/plupload.html4.js +++ b/assets/javascripts/plupload/plupload.html4.js @@ -30,15 +30,13 @@ * * @return {Object} Name/value object with supported features. */ - getFeatures : function() { + getFeatures : function() { // Only multipart feature return { multipart: true, - /* WebKit let you trigger file dialog programmatically while FF and Opera - do not, so we - sniff for it here... probably not that good idea, but impossibillity of controlling cursor style - on top of add files button obviously feels even worse */ - canOpenDialog: navigator.userAgent.indexOf('WebKit') !== -1 + // WebKit and Gecko 2+ can trigger file dialog progrmmatically + triggerDialog: (plupload.ua.gecko && window.FormData || plupload.ua.webkit) }; }, @@ -106,7 +104,7 @@ browseButton = getById(up.settings.browse_button); // Route click event to input element programmatically, if possible - if (up.features.canOpenDialog && browseButton) { + if (up.features.triggerDialog && browseButton) { plupload.addEvent(getById(up.settings.browse_button), 'click', function(e) { input.click(); e.preventDefault(); @@ -118,7 +116,7 @@ width : '100%', height : '100%', opacity : 0, - fontSize: '99px' // force input element to be bigger then needed to occupy whole space + fontSize: '999px' // force input element to be bigger then needed to occupy whole space }); plupload.extend(form.style, { @@ -153,7 +151,7 @@ files.push(new plupload.File(currentFileId, name)); // Clean-up events - they won't be needed anymore - if (!up.features.canOpenDialog) { + if (!up.features.triggerDialog) { plupload.removeAllEvents(form, up.id); } else { plupload.removeEvent(browseButton, 'click', up.id); @@ -209,8 +207,8 @@ } // Get result - result = el.documentElement.innerText || el.documentElement.textContent; - + result = el.body.innerHTML; + // Assume no error if (result) { currentFile.status = plupload.DONE; @@ -287,14 +285,16 @@ if (up.state == plupload.STOPPED) { window.setTimeout(function() { plupload.removeEvent(iframe, 'load', up.id); - iframe.parentNode.removeChild(iframe); + if (iframe.parentNode) { // #382 + iframe.parentNode.removeChild(iframe); + } }, 0); } }); // Refresh button, will reposition the input form up.bind("Refresh", function(up) { - var browseButton, topElement, hoverClass, activeClass, browsePos, browseSize, inputContainer, inputFile, pzIndex; + var browseButton, topElement, hoverClass, activeClass, browsePos, browseSize, inputContainer, inputFile, zIndex; browseButton = getById(up.settings.browse_button); if (browseButton) { @@ -312,25 +312,25 @@ // for IE and WebKit place input element underneath the browse button and route onclick event // TODO: revise when browser support for this feature will change - if (up.features.canOpenDialog) { - pzIndex = parseInt(browseButton.parentNode.style.zIndex, 10); - - if (isNaN(pzIndex)) { - pzIndex = 0; - } - - plupload.extend(browseButton.style, { - zIndex : pzIndex - }); - + if (up.features.triggerDialog) { if (plupload.getStyle(browseButton, 'position') === 'static') { plupload.extend(browseButton.style, { position : 'relative' }); } + + zIndex = parseInt(browseButton.style.zIndex, 10); + + if (isNaN(zIndex)) { + zIndex = 0; + } + + plupload.extend(browseButton.style, { + zIndex : zIndex + }); plupload.extend(inputContainer.style, { - zIndex : pzIndex - 1 + zIndex : zIndex - 1 }); } @@ -340,7 +340,7 @@ TODO: needs to be revised as things will change */ hoverClass = up.settings.browse_button_hover; activeClass = up.settings.browse_button_active; - topElement = up.features.canOpenDialog ? browseButton : inputContainer; + topElement = up.features.triggerDialog ? browseButton : inputContainer; if (hoverClass) { plupload.addEvent(topElement, 'mouseover', function() { diff --git a/assets/javascripts/plupload/plupload.html5.js b/assets/javascripts/plupload/plupload.html5.js index 35fe451b..3e5ecfc5 100644 --- a/assets/javascripts/plupload/plupload.html5.js +++ b/assets/javascripts/plupload/plupload.html5.js @@ -12,27 +12,8 @@ /*global plupload:false, File:false, window:false, atob:false, FormData:false, FileReader:false, ArrayBuffer:false, Uint8Array:false, BlobBuilder:false, unescape:false */ (function(window, document, plupload, undef) { - var fakeSafariDragDrop; - - if ((typeof File !== 'undefined') && !File.prototype.slice) { - if (File.prototype.webkitSlice) File.prototype.slice = File.prototype.webkitSlice; - if (File.prototype.mozSlice) File.prototype.slice = File.prototype.mozSlice; - } - - /* Introduce sendAsBinary for latest WebKits having support for BlobBuilder and typed arrays: - credits: http://javascript0.org/wiki/Portable_sendAsBinary, - more info: http://code.google.com/p/chromium/issues/detail?id=35705 - */ - if (window.Uint8Array && window.ArrayBuffer && !XMLHttpRequest.prototype.sendAsBinary) { - XMLHttpRequest.prototype.sendAsBinary = function(datastr) { - var ui8a = new Uint8Array(datastr.length); - for (var i = 0; i < datastr.length; i++) { - ui8a[i] = (datastr.charCodeAt(i) & 0xff); - } - this.send(ui8a.buffer); - }; - } - + var html5files = {}, // queue of original File objects + fakeSafariDragDrop; function readFileAsDataURL(file, callback) { var reader; @@ -64,10 +45,11 @@ } } - function scaleImage(image_file, resize, mime, callback) { - var canvas, context, img, scale; - - readFileAsDataURL(image_file, function(data) { + function scaleImage(file, resize, mime, callback) { + var canvas, context, img, scale, + up = this; + + readFileAsDataURL(html5files[file.id], function(data) { // Setup canvas and context canvas = document.createElement("canvas"); canvas.style.display = 'none'; @@ -112,9 +94,18 @@ // Set new width and height exifParser.setExif('PixelXDimension', width); exifParser.setExif('PixelYDimension', height); - + // Update EXIF header jpegHeaders.set('exif', exifParser.getBinary()); + + // trigger Exif events only if someone listens to them + if (up.hasEventListener('ExifData')) { + up.trigger('ExifData', file, exifParser.EXIF()); + } + + if (up.hasEventListener('GpsData')) { + up.trigger('GpsData', file, exifParser.GPS()); + } } } @@ -134,8 +125,8 @@ data = data.substring(data.indexOf('base64,') + 7); data = atob(data); - // Restore JPEG headers - if (jpegHeaders['headers'] && jpegHeaders['headers'].length) { + // Restore JPEG headers if applicable + if (jpegHeaders && jpegHeaders['headers'] && jpegHeaders['headers'].length) { data = jpegHeaders.restore(data); jpegHeaders.purge(); // free memory } @@ -167,11 +158,11 @@ * @return {Object} Name/value object with supported features. */ getFeatures : function() { - var xhr, hasXhrSupport, hasProgress, dataAccessSupport, sliceSupport, win = window; + var xhr, hasXhrSupport, hasProgress, canSendBinary, dataAccessSupport, sliceSupport; hasXhrSupport = hasProgress = dataAccessSupport = sliceSupport = false; - if (win.XMLHttpRequest) { + if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); hasProgress = !!xhr.upload; hasXhrSupport = !!(xhr.sendAsBinary || xhr.upload); @@ -179,28 +170,35 @@ // Check for support for various features if (hasXhrSupport) { + canSendBinary = !!(xhr.sendAsBinary || (window.Uint8Array && window.ArrayBuffer)); + // Set dataAccessSupport only for Gecko since BlobBuilder and XHR doesn't handle binary data correctly - dataAccessSupport = !!(File && (File.prototype.getAsDataURL || win.FileReader) && xhr.sendAsBinary); - sliceSupport = !!(File && File.prototype.slice); + dataAccessSupport = !!(File && (File.prototype.getAsDataURL || window.FileReader) && canSendBinary); + sliceSupport = !!(File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice)); } - // Sniff for Safari and fake drag/drop - fakeSafariDragDrop = navigator.userAgent.indexOf('Safari') > 0 && navigator.vendor.indexOf('Apple') !== -1; + // sniff out Safari for Windows and fake drag/drop + fakeSafariDragDrop = plupload.ua.safari && plupload.ua.windows; return { - // Detect drag/drop file support by sniffing, will try to find a better way html5: hasXhrSupport, // This is a special one that we check inside the init call - dragdrop: win.mozInnerScreenX !== undef || sliceSupport || fakeSafariDragDrop, + dragdrop: (function() { + // this comes directly from Modernizr: http://www.modernizr.com/ + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }()), jpgresize: dataAccessSupport, pngresize: dataAccessSupport, - multipart: dataAccessSupport || !!win.FileReader || !!win.FormData, + multipart: dataAccessSupport || !!window.FileReader || !!window.FormData, + canSendBinary: canSendBinary, + // gecko 2/5/6 can't send blob with FormData: https://bugzilla.mozilla.org/show_bug.cgi?id=649150 + cantSendBlobInFormData: !!(plupload.ua.gecko && window.FormData && window.FileReader && !FileReader.prototype.readAsArrayBuffer), progress: hasProgress, - chunks: sliceSupport || dataAccessSupport, - - /* WebKit let you trigger file dialog programmatically while FF and Opera - do not, so we - sniff for it here... probably not that good idea, but impossibillity of controlling cursor style - on top of add files button obviously feels even worse */ - canOpenDialog: navigator.userAgent.indexOf('WebKit') !== -1 + chunks: sliceSupport, + // Safari on Windows has problems when selecting multiple files + multi_selection: !(plupload.ua.safari && plupload.ua.windows), + // WebKit and Gecko 2+ can trigger file dialog progrmmatically + triggerDialog: (plupload.ua.gecko && window.FormData || plupload.ua.webkit) }; }, @@ -212,7 +210,7 @@ * @param {function} callback Callback to execute when the runtime initializes or fails to initialize. If it succeeds an object with a parameter name success will be set to true. */ init : function(uploader, callback) { - var html5files = {}, features; + var features; function addSelectedFiles(native_files) { var file, i, files = [], id, fileNames = {}; @@ -220,7 +218,7 @@ // Add the selected files to the file queue for (i = 0; i < native_files.length; i++) { file = native_files[i]; - + // Safari on Windows will add first file from dragged set multiple times // @see: https://bugs.webkit.org/show_bug.cgi?id=37957 if (fileNames[file.name]) { @@ -233,7 +231,7 @@ html5files[id] = file; // Expose id, name and size - files.push(new plupload.File(id, file.fileName, file.fileSize || file.size)); // File.fileSize depricated + files.push(new plupload.File(id, file.fileName || file.name, file.fileSize || file.size)); // fileName / fileSize depricated } // Trigger FilesAdded event if we added any @@ -265,7 +263,6 @@ zIndex : 99999, opacity : uploader.settings.shim_bgcolor ? '' : 0 // Force transparent if bgcolor is undefined }); - inputContainer.className = 'plupload html5'; if (uploader.settings.container) { @@ -300,29 +297,44 @@ // Insert the input inside the input container - inputContainer.innerHTML = ''; - + inputContainer.innerHTML = ''; + + inputContainer.scrollTop = 100; inputFile = document.getElementById(uploader.id + '_html5'); + + if (up.features.triggerDialog) { + plupload.extend(inputFile.style, { + position: 'absolute', + width: '100%', + height: '100%' + }); + } else { + // shows arrow cursor instead of the text one, bit more logical + plupload.extend(inputFile.style, { + cssFloat: 'right', + styleFloat: 'right' + }); + } + inputFile.onchange = function() { // Add the selected files from file input addSelectedFiles(this.files); - + // Clearing the value enables the user to select the same file again if they want to this.value = ''; }; /* Since we have to place input[type=file] on top of the browse_button for some browsers (FF, Opera), browse_button loses interactivity, here we try to neutralize this issue highlighting browse_button - with a special class + with a special classes TODO: needs to be revised as things will change */ browseButton = document.getElementById(up.settings.browse_button); if (browseButton) { var hoverClass = up.settings.browse_button_hover, activeClass = up.settings.browse_button_active, - topElement = up.features.canOpenDialog ? browseButton : inputContainer; + topElement = up.features.triggerDialog ? browseButton : inputContainer; if (hoverClass) { plupload.addEvent(topElement, 'mouseover', function() { @@ -343,7 +355,7 @@ } // Route click event to the input[type=file] element for supporting browsers - if (up.features.canOpenDialog) { + if (up.features.triggerDialog) { plupload.addEvent(browseButton, 'click', function(e) { document.getElementById(up.id + '_html5').click(); e.preventDefault(); @@ -374,7 +386,7 @@ plupload.addEvent(dropInputElm, 'change', function() { // Add the selected files from file input addSelectedFiles(this.files); - + // Remove input element plupload.removeEvent(dropInputElm, 'change', uploader.id); dropInputElm.parentNode.removeChild(dropInputElm); @@ -426,7 +438,7 @@ }); uploader.bind("Refresh", function(up) { - var browseButton, browsePos, browseSize, inputContainer, pzIndex; + var browseButton, browsePos, browseSize, inputContainer, zIndex; browseButton = document.getElementById(uploader.settings.browse_button); if (browseButton) { @@ -443,25 +455,24 @@ // for WebKit place input element underneath the browse button and route onclick event // TODO: revise when browser support for this feature will change - if (uploader.features.canOpenDialog) { - pzIndex = parseInt(browseButton.parentNode.style.zIndex, 10); - - if (isNaN(pzIndex)) { - pzIndex = 0; - } - - plupload.extend(browseButton.style, { - zIndex : pzIndex - }); - + if (uploader.features.triggerDialog) { if (plupload.getStyle(browseButton, 'position') === 'static') { plupload.extend(browseButton.style, { position : 'relative' }); } + + zIndex = parseInt(plupload.getStyle(browseButton, 'z-index'), 10); + if (isNaN(zIndex)) { + zIndex = 0; + } + + plupload.extend(browseButton.style, { + zIndex : zIndex + }); plupload.extend(inputContainer.style, { - zIndex : pzIndex - 1 + zIndex : zIndex - 1 }); } } @@ -469,14 +480,201 @@ uploader.bind("UploadFile", function(up, file) { var settings = up.settings, nativeFile, resize; + + function w3cBlobSlice(blob, start, end) { + var blobSlice; + + if (File.prototype.slice) { + try { + blob.slice(); // depricated version will throw WRONG_ARGUMENTS_ERR exception + return blob.slice(start, end); + } catch (e) { + // depricated slice method + return blob.slice(start, end - start); + } + // slice method got prefixed: https://bugzilla.mozilla.org/show_bug.cgi?id=649672 + } else if (blobSlice = File.prototype.webkitSlice || File.prototype.mozSlice) { + return blobSlice.call(blob, start, end); + } else { + return null; // or throw some exception + } + } function sendBinaryBlob(blob) { - var chunk = 0, loaded = 0; + var chunk = 0, loaded = 0, + fr = ("FileReader" in window) ? new FileReader : null; + function uploadNextChunk() { - var chunkBlob = blob, xhr, upload, chunks, args, multipartDeltaSize = 0, - boundary = '----pluploadboundary' + plupload.guid(), chunkSize, curChunkSize, formData, - dashdash = '--', crlf = '\r\n', multipartBlob = '', mimeType, url = up.settings.url; + var chunkBlob, br, chunks, args, chunkSize, curChunkSize, mimeType, url = up.settings.url; + + + function prepareAndSend(bin) { + var multipartDeltaSize = 0, + xhr = new XMLHttpRequest, + upload = xhr.upload, + boundary = '----pluploadboundary' + plupload.guid(), formData, dashdash = '--', crlf = '\r\n', multipartBlob = '' + + // Do we have upload progress support + if (upload) { + upload.onprogress = function(e) { + file.loaded = Math.min(file.size, loaded + e.loaded - multipartDeltaSize); // Loaded can be larger than file size due to multipart encoding + up.trigger('UploadProgress', file); + }; + } + + xhr.onreadystatechange = function() { + var httpStatus, chunkArgs; + + if (xhr.readyState == 4) { + // Getting the HTTP status might fail on some Gecko versions + try { + httpStatus = xhr.status; + } catch (ex) { + httpStatus = 0; + } + + // Is error status + if (httpStatus >= 400) { + up.trigger('Error', { + code : plupload.HTTP_ERROR, + message : plupload.translate('HTTP Error.'), + file : file, + status : httpStatus + }); + } else { + // Handle chunk response + if (chunks) { + chunkArgs = { + chunk : chunk, + chunks : chunks, + response : xhr.responseText, + status : httpStatus + }; + + up.trigger('ChunkUploaded', file, chunkArgs); + loaded += curChunkSize; + + // Stop upload + if (chunkArgs.cancelled) { + file.status = plupload.FAILED; + return; + } + + file.loaded = Math.min(file.size, (chunk + 1) * chunkSize); + } else { + file.loaded = file.size; + } + + up.trigger('UploadProgress', file); + + bin = chunkBlob = formData = multipartBlob = null; // Free memory + + // Check if file is uploaded + if (!chunks || ++chunk >= chunks) { + file.status = plupload.DONE; + + up.trigger('FileUploaded', file, { + response : xhr.responseText, + status : httpStatus + }); + } else { + // Still chunks left + uploadNextChunk(); + } + } + + xhr = null; + + } + }; + + + // Build multipart request + if (up.settings.multipart && features.multipart) { + + args.name = file.target_name || file.name; + + xhr.open("post", url, true); + + // Set custom headers + plupload.each(up.settings.headers, function(value, name) { + xhr.setRequestHeader(name, value); + }); + + + // if has FormData support like Chrome 6+, Safari 5+, Firefox 4, use it + if (typeof(bin) !== 'string' && !!window.FormData) { + formData = new FormData(); + + // Add multipart params + plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) { + formData.append(name, value); + }); + + // Add file and send it + formData.append(up.settings.file_data_name, bin); + xhr.send(formData); + + return; + } // if no FormData we can still try to send it directly as last resort (see below) + + + if (typeof(bin) === 'string') { + // Trying to send the whole thing as binary... + + // multipart request + xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); + + // append multipart parameters + plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) { + multipartBlob += dashdash + boundary + crlf + + 'Content-Disposition: form-data; name="' + name + '"' + crlf + crlf; + + multipartBlob += unescape(encodeURIComponent(value)) + crlf; + }); + + mimeType = plupload.mimeTypes[file.name.replace(/^.+\.([^.]+)/, '$1').toLowerCase()] || 'application/octet-stream'; + + // Build RFC2388 blob + multipartBlob += dashdash + boundary + crlf + + 'Content-Disposition: form-data; name="' + up.settings.file_data_name + '"; filename="' + unescape(encodeURIComponent(file.name)) + '"' + crlf + + 'Content-Type: ' + mimeType + crlf + crlf + + bin + crlf + + dashdash + boundary + dashdash + crlf; + + multipartDeltaSize = multipartBlob.length - bin.length; + bin = multipartBlob; + + + if (xhr.sendAsBinary) { // Gecko + xhr.sendAsBinary(bin); + } else if (features.canSendBinary) { // WebKit with typed arrays support + var ui8a = new Uint8Array(bin.length); + for (var i = 0; i < bin.length; i++) { + ui8a[i] = (bin.charCodeAt(i) & 0xff); + } + xhr.send(ui8a.buffer); + } + return; // will return from here only if shouldn't send binary + } + } + + // if no multipart, or last resort, send as binary stream + url = plupload.buildUrl(up.settings.url, plupload.extend(args, up.settings.multipart_params)); + + xhr.open("post", url, true); + + xhr.setRequestHeader('Content-Type', 'application/octet-stream'); // Binary stream header + + // Set custom headers + plupload.each(up.settings.headers, function(value, name) { + xhr.setRequestHeader(name, value); + }); + + xhr.send(bin); + } // prepareAndSend + // File upload finished if (file.status == plupload.DONE || file.status == plupload.FAILED || up.state == plupload.STOPPED) { @@ -487,7 +685,7 @@ args = {name : file.target_name || file.name}; // Only add chunking args if needed - if (settings.chunk_size && features.chunks) { + if (settings.chunk_size && file.size > settings.chunk_size && (features.chunks || typeof(blob) == 'string')) { // blob will be of type string if it was loaded in memory chunkSize = settings.chunk_size; chunks = Math.ceil(file.size / chunkSize); curChunkSize = Math.min(chunkSize, file.size - (chunk * chunkSize)); @@ -498,7 +696,7 @@ chunkBlob = blob.substring(chunk * chunkSize, chunk * chunkSize + curChunkSize); } else { // Slice the chunk - chunkBlob = blob.slice(chunk * chunkSize, curChunkSize); + chunkBlob = w3cBlobSlice(blob, chunk * chunkSize, chunk * chunkSize + curChunkSize); } // Setup query string arguments @@ -506,148 +704,19 @@ args.chunks = chunks; } else { curChunkSize = file.size; + chunkBlob = blob; } - - // Setup XHR object - xhr = new XMLHttpRequest(); - upload = xhr.upload; - - // Do we have upload progress support - if (upload) { - upload.onprogress = function(e) { - file.loaded = Math.min(file.size, loaded + e.loaded - multipartDeltaSize); // Loaded can be larger than file size due to multipart encoding - up.trigger('UploadProgress', file); - }; - } - - // Add name, chunk and chunks to query string on direct streaming - if (!up.settings.multipart || !features.multipart) { - url = plupload.buildUrl(up.settings.url, args); - } else { - args.name = file.target_name || file.name; - } - - xhr.open("post", url, true); - - xhr.onreadystatechange = function() { - var httpStatus, chunkArgs; - - if (xhr.readyState == 4) { - // Getting the HTTP status might fail on some Gecko versions - try { - httpStatus = xhr.status; - } catch (ex) { - httpStatus = 0; - } - - // Is error status - if (httpStatus >= 400) { - up.trigger('Error', { - code : plupload.HTTP_ERROR, - message : plupload.translate('HTTP Error.'), - file : file, - status : httpStatus - }); - } else { - // Handle chunk response - if (chunks) { - chunkArgs = { - chunk : chunk, - chunks : chunks, - response : xhr.responseText, - status : httpStatus - }; - - up.trigger('ChunkUploaded', file, chunkArgs); - loaded += curChunkSize; - - // Stop upload - if (chunkArgs.cancelled) { - file.status = plupload.FAILED; - return; - } - - file.loaded = Math.min(file.size, (chunk + 1) * chunkSize); - } else { - file.loaded = file.size; - } - - up.trigger('UploadProgress', file); - - // Check if file is uploaded - if (!chunks || ++chunk >= chunks) { - file.status = plupload.DONE; - up.trigger('FileUploaded', file, { - response : xhr.responseText, - status : httpStatus - }); - - nativeFile = blob = html5files[file.id] = null; // Free memory - } else { - // Still chunks left - uploadNextChunk(); - } - } - - xhr = chunkBlob = formData = multipartBlob = null; // Free memory + + // workaround Gecko 2,5,6 FormData+Blob bug: https://bugzilla.mozilla.org/show_bug.cgi?id=649150 + if (typeof(chunkBlob) !== 'string' && fr && features.cantSendBlobInFormData && features.chunks && up.settings.chunk_size) {// Gecko 2,5,6 + fr.onload = function() { + prepareAndSend(fr.result); } - }; - - // Set custom headers - plupload.each(up.settings.headers, function(value, name) { - xhr.setRequestHeader(name, value); - }); - - // Build multipart request - if (up.settings.multipart && features.multipart) { - // Has FormData support like Chrome 6+, Safari 5+, Firefox 4 - if (!xhr.sendAsBinary) { - formData = new FormData(); - - // Add multipart params - plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) { - formData.append(name, value); - }); - - // Add file and send it - formData.append(up.settings.file_data_name, chunkBlob); - xhr.send(formData); - - return; - } - - // Gecko multipart request - xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); - - // Append multipart parameters - plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) { - multipartBlob += dashdash + boundary + crlf + - 'Content-Disposition: form-data; name="' + name + '"' + crlf + crlf; - - multipartBlob += unescape(encodeURIComponent(value)) + crlf; - }); - - mimeType = plupload.mimeTypes[file.name.replace(/^.+\.([^.]+)/, '$1').toLowerCase()] || 'application/octet-stream'; - - // Build RFC2388 blob - multipartBlob += dashdash + boundary + crlf + - 'Content-Disposition: form-data; name="' + up.settings.file_data_name + '"; filename="' + unescape(encodeURIComponent(file.name)) + '"' + crlf + - 'Content-Type: ' + mimeType + crlf + crlf + - chunkBlob + crlf + - dashdash + boundary + dashdash + crlf; - - multipartDeltaSize = multipartBlob.length - chunkBlob.length; - chunkBlob = multipartBlob; + fr.readAsBinaryString(chunkBlob); } else { - // Binary stream header - xhr.setRequestHeader('Content-Type', 'application/octet-stream'); - } - - if (xhr.sendAsBinary) { - xhr.sendAsBinary(chunkBlob); // Gecko - } else { - xhr.send(chunkBlob); // WebKit + prepareAndSend(chunkBlob); } + } // Start uploading chunks @@ -655,26 +724,24 @@ } nativeFile = html5files[file.id]; - resize = up.settings.resize; - - if (features.jpgresize) { - // Resize image if it's a supported format and resize is enabled - if (resize && /\.(png|jpg|jpeg)$/i.test(file.name)) { - scaleImage(nativeFile, resize, /\.png$/i.test(file.name) ? 'image/png' : 'image/jpeg', function(res) { - // If it was scaled send the scaled image if it failed then - // send the raw image and let the server do the scaling - if (res.success) { - file.size = res.data.length; - sendBinaryBlob(res.data); - } else { - readFileAsBinary(nativeFile, sendBinaryBlob); - } - }); - } else { - readFileAsBinary(nativeFile, sendBinaryBlob); - } + + // Resize image if it's a supported format and resize is enabled + if (features.jpgresize && up.settings.resize && /\.(png|jpg|jpeg)$/i.test(file.name)) { + scaleImage.call(up, file, up.settings.resize, /\.png$/i.test(file.name) ? 'image/png' : 'image/jpeg', function(res) { + // If it was scaled send the scaled image if it failed then + // send the raw image and let the server do the scaling + if (res.success) { + file.size = res.data.length; + sendBinaryBlob(res.data); + } else { + sendBinaryBlob(nativeFile); + } + }); + // if there's no way to slice file without preloading it in memory, preload it + } else if (!features.chunks && features.jpgresize) { + readFileAsBinary(nativeFile, sendBinaryBlob); } else { - sendBinaryBlob(nativeFile); // this works on older WebKits, but fails on fresh ones + sendBinaryBlob(nativeFile); } }); @@ -874,10 +941,19 @@ read.init(data); // Check if data is jpeg - if (read.SHORT(0) !== 0xFFD8) { + var jpegHeaders = new JPEG_Headers(data); + + if (!jpegHeaders['headers']) { return false; } + // Delete any existing headers that need to be replaced + for (var i = jpegHeaders['headers'].length; i > 0; i--) { + var hdr = jpegHeaders['headers'][i - 1]; + read.SEGMENT(hdr.start, hdr.length, '') + } + jpegHeaders.purge(); + idx = read.SHORT(2) == 0xFFE0 ? 4 + read.SHORT(4) : 2; for (var i = 0, max = headers.length; i < max; i++) { @@ -1276,8 +1352,7 @@ } return false; }, - - + EXIF: function() { var Exif; @@ -1285,12 +1360,14 @@ Exif = extractTags(offsets.exifIFD, tags.exif); // Fix formatting of some tags - Exif.ExifVersion = String.fromCharCode( - Exif.ExifVersion[0], - Exif.ExifVersion[1], - Exif.ExifVersion[2], - Exif.ExifVersion[3] - ); + if (Exif.ExifVersion) { + Exif.ExifVersion = String.fromCharCode( + Exif.ExifVersion[0], + Exif.ExifVersion[1], + Exif.ExifVersion[2], + Exif.ExifVersion[3] + ); + } return Exif; }, @@ -1299,7 +1376,11 @@ var GPS; GPS = extractTags(offsets.gpsIFD, tags.gps); - GPS.GPSVersionID = GPS.GPSVersionID.join('.'); + + // iOS devices (and probably some others) do not put in GPSVersionID tag (why?..) + if (GPS.GPSVersionID) { + GPS.GPSVersionID = GPS.GPSVersionID.join('.'); + } return GPS; }, diff --git a/assets/javascripts/plupload/plupload.js b/assets/javascripts/plupload/plupload.js index 93f71da6..2e903916 100644 --- a/assets/javascripts/plupload/plupload.js +++ b/assets/javascripts/plupload/plupload.js @@ -58,6 +58,7 @@ "image/bmp,bmp," + "image/gif,gif," + "image/jpeg,jpeg jpg jpe," + + "image/photoshop,psd," + "image/png,png," + "image/svg+xml,svg svgz," + "image/tiff,tiff tif," + @@ -68,7 +69,11 @@ "video/mp4,mp4," + "video/x-m4v,m4v," + "video/x-flv,flv," + + "video/x-ms-wmv,wmv," + + "video/avi,avi," + + "video/webm,webm," + "video/vnd.rn-realvideo,rv," + + "text/csv,csv," + "text/plain,asc txt text diff log," + "application/octet-stream,exe" ); @@ -183,7 +188,7 @@ INIT_ERROR : -500, /** - * File size error. If the user selects a file that is to large it will be blocked and an error of this type will be triggered. + * File size error. If the user selects a file that is too large it will be blocked and an error of this type will be triggered. * * @property FILE_SIZE_ERROR * @final @@ -231,6 +236,26 @@ * @final */ mimeTypes : mimes, + + /** + * In some cases sniffing is the only way around :( + */ + ua: (function() { + var nav = navigator, userAgent = nav.userAgent, vendor = nav.vendor, webkit, opera, safari; + + webkit = /WebKit/.test(userAgent); + safari = webkit && vendor.indexOf('Apple') !== -1; + opera = window.opera && window.opera.buildNumber; + + return { + windows: navigator.platform.indexOf('Win') !== -1, + ie: !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName), + webkit: webkit, + gecko: !webkit && /Gecko/.test(userAgent), + safari: safari, + opera: !!opera + }; + }()), /** * Extends the specified object with another object. @@ -491,7 +516,7 @@ var mul; if (typeof(size) == 'string') { - size = /^([0-9]+)([mgk]+)$/.exec(size.toLowerCase().replace(/[^0-9mkg]/g, '')); + size = /^([0-9]+)([mgk]?)$/.exec(size.toLowerCase().replace(/[^0-9mkg]/g, '')); mul = size[2]; size = +size[1]; @@ -657,7 +682,11 @@ } // Add event listener - if (obj.attachEvent) { + if (obj.addEventListener) { + func = callback; + + obj.addEventListener(name, func, false); + } else if (obj.attachEvent) { func = function() { var evt = window.event; @@ -672,12 +701,7 @@ callback(evt); }; obj.attachEvent('on' + name, func); - - } else if (obj.addEventListener) { - func = callback; - - obj.addEventListener(name, func, false); - } + } // Log event handler to objects internal Plupload registry if (obj[uid] === undef) { @@ -786,7 +810,7 @@ plupload.each(eventhash[obj[uid]], function(events, name) { plupload.removeEvent(obj, name, key); }); - } + } }; @@ -848,8 +872,9 @@ if (!file && files[i].status == plupload.QUEUED) { file = files[i]; file.status = plupload.UPLOADING; - this.trigger("BeforeUpload", file); - this.trigger("UploadFile", file); + if (this.trigger("BeforeUpload", file)) { + this.trigger("UploadFile", file); + } } else { count++; } @@ -857,8 +882,8 @@ // All files are DONE or FAILED if (count == files.length) { - this.trigger("UploadComplete", files); this.stop(); + this.trigger("UploadComplete", files); } } } @@ -1302,6 +1327,16 @@ return true; }, + + /** + * Check whether uploader has any listeners to the specified event. + * + * @method hasEventListener + * @param {String} name Event name to check for. + */ + hasEventListener : function(name) { + return !!events[name.toLowerCase()]; + }, /** * Adds an event listener by name. diff --git a/assets/javascripts/plupload/plupload.silverlight.js b/assets/javascripts/plupload/plupload.silverlight.js index 34d8aa17..6d285f7b 100644 --- a/assets/javascripts/plupload/plupload.silverlight.js +++ b/assets/javascripts/plupload/plupload.silverlight.js @@ -17,6 +17,11 @@ function jsonSerialize(obj) { var value, type = typeof obj, isArray, i, key; + // Treat undefined as null + if (obj === undef || obj === null) { + return 'null'; + } + // Encode strings if (type === 'string') { value = '\bb\tt\nn\ff\rr\""\'\'\\\\'; @@ -66,11 +71,6 @@ return value; } - // Treat undefined as null - if (obj === undef) { - return 'null'; - } - // Convert all other types to string return '' + obj; } @@ -167,7 +167,8 @@ pngresize: true, chunks: true, progress: true, - multipart: true + multipart: true, + multi_selection: true }; }, diff --git a/assets/javascripts/plupload/plupload.silverlight.xap b/assets/javascripts/plupload/plupload.silverlight.xap index c92dbf0b6802e87705932c451048f54323e97fd7..1a5cbb5681717d0799a209aeb909be2a50471a42 100644 GIT binary patch delta 38515 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

3qs8zDG>3`d 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 DP&6KR delta 38145 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