/media/system/js/swf-uncompressed.js
https://bitbucket.org/eternaware/joomus · JavaScript · 490 lines · 344 code · 92 blank · 54 comment · 65 complexity · df0efb1df295efc80b72bb0fa729561f MD5 · raw file
- /**
- * Swiff.Uploader - Flash FileReference Control
- *
- * @version 3.0
- *
- * @license MIT License
- *
- * @author Harald Kirschner <http://digitarald.de>
- * @author Valerio Proietti, <http://mad4milk.net>
- * @copyright Authors
- */
- Swiff.Uploader = new Class({
- Extends: Swiff,
- Implements: Events,
- options: {
- path: 'Swiff.Uploader.swf',
- target: null,
- zIndex: 9999,
- callBacks: null,
- params: {
- wMode: 'opaque',
- menu: 'false',
- allowScriptAccess: 'always'
- },
- typeFilter: null,
- multiple: true,
- queued: true,
- verbose: false,
- height: 30,
- width: 100,
- passStatus: null,
- url: null,
- method: null,
- data: null,
- mergeData: true,
- fieldName: null,
- fileSizeMin: 1,
- fileSizeMax: null, // Official limit is 100 MB for FileReference, but I tested up to 2Gb!
- allowDuplicates: false,
- timeLimit: (Browser.Platform.linux) ? 0 : 30,
- policyFile: null,
- buttonImage: null,
- fileListMax: 0,
- fileListSizeMax: 0,
- instantStart: false,
- appendCookieData: false,
- fileClass: null
- /*
- onLoad: $empty,
- onFail: $empty,
- onStart: $empty,
- onQueue: $empty,
- onComplete: $empty,
- onBrowse: $empty,
- onDisabledBrowse: $empty,
- onCancel: $empty,
- onSelect: $empty,
- onSelectSuccess: $empty,
- onSelectFail: $empty,
- onButtonEnter: $empty,
- onButtonLeave: $empty,
- onButtonDown: $empty,
- onButtonDisable: $empty,
- onFileStart: $empty,
- onFileStop: $empty,
- onFileRequeue: $empty,
- onFileOpen: $empty,
- onFileProgress: $empty,
- onFileComplete: $empty,
- onFileRemove: $empty,
- onBeforeStart: $empty,
- onBeforeStop: $empty,
- onBeforeRemove: $empty
- */
- },
- initialize: function(options) {
- // protected events to control the class, added
- // before setting options (which adds own events)
- this.addEvent('load', this.initializeSwiff, true)
- .addEvent('select', this.processFiles, true)
- .addEvent('complete', this.update, true)
- .addEvent('fileRemove', function(file) {
- this.fileList.erase(file);
- }.bind(this), true);
- this.setOptions(options);
- // callbacks are no longer in the options, every callback
- // is fired as event, this is just compat
- if (this.options.callBacks) {
- Hash.each(this.options.callBacks, function(fn, name) {
- this.addEvent(name, fn);
- }, this);
- }
- this.options.callBacks = {
- fireCallback: this.fireCallback.bind(this)
- };
- var path = this.options.path;
- if (!path.contains('?')) path += '?noCache=' + Date.now; // cache in IE
- // container options for Swiff class
- this.options.container = this.box = new Element('span', {'class': 'swiff-uploader-box'}).inject(document.id(this.options.container) || document.body);
- // target
- this.target = document.id(this.options.target);
- if (this.target) {
- var scroll = window.getScroll();
- this.box.setStyles({
- position: 'absolute',
- visibility: 'visible',
- zIndex: this.options.zIndex,
- overflow: 'hidden',
- height: 1, width: 1,
- top: scroll.y, left: scroll.x
- });
- // we force wMode to transparent for the overlay effect
- this.parent(path, {
- params: {
- wMode: 'transparent'
- },
- height: '100%',
- width: '100%'
- });
- this.target.addEvent('mouseenter', this.reposition.bind(this, []));
- // button interactions, relayed to to the target
- this.addEvents({
- buttonEnter: this.targetRelay.bind(this, ['mouseenter']),
- buttonLeave: this.targetRelay.bind(this, ['mouseleave']),
- buttonDown: this.targetRelay.bind(this, ['mousedown']),
- buttonDisable: this.targetRelay.bind(this, ['disable'])
- });
- this.reposition();
- window.addEvent('resize', this.reposition.bind(this, []));
- } else {
- this.parent(path);
- }
- this.inject(this.box);
- this.fileList = [];
- this.size = this.uploading = this.bytesLoaded = this.percentLoaded = 0;
- if (Browser.Plugins.Flash.version < 9) {
- this.fireEvent('fail', ['flash']);
- } else {
- this.verifyLoad.delay(1000, this);
- }
- },
- verifyLoad: function() {
- if (this.loaded) return;
- if (!this.object.parentNode) {
- this.fireEvent('fail', ['disabled']);
- } else if (this.object.style.display == 'none') {
- this.fireEvent('fail', ['hidden']);
- } else if (!this.object.offsetWidth) {
- this.fireEvent('fail', ['empty']);
- }
- },
- fireCallback: function(name, args) {
- // file* callbacks are relayed to the specific file
- if (name.substr(0, 4) == 'file') {
- // updated queue data is the second argument
- if (args.length > 1) this.update(args[1]);
- var data = args[0];
- var file = this.findFile(data.id);
- this.fireEvent(name, file || data, 5);
- if (file) {
- var fire = name.replace(/^file([A-Z])/, function($0, $1) {
- return $1.toLowerCase();
- });
- file.update(data).fireEvent(fire, [data], 10);
- }
- } else {
- this.fireEvent(name, args, 5);
- }
- },
- update: function(data) {
- // the data is saved right to the instance
- Object.append(this, data);
- this.fireEvent('queue', [this], 10);
- return this;
- },
- findFile: function(id) {
- for (var i = 0; i < this.fileList.length; i++) {
- if (this.fileList[i].id == id) return this.fileList[i];
- }
- return null;
- },
- initializeSwiff: function() {
- // extracted options for the swf
- this.remote('xInitialize', {
- typeFilter: this.options.typeFilter,
- multiple: this.options.multiple,
- queued: this.options.queued,
- verbose: this.options.verbose,
- width: this.options.width,
- height: this.options.height,
- passStatus: this.options.passStatus,
- url: this.options.url,
- method: this.options.method,
- data: this.options.data,
- mergeData: this.options.mergeData,
- fieldName: this.options.fieldName,
- fileSizeMin: this.options.fileSizeMin,
- fileSizeMax: this.options.fileSizeMax,
- allowDuplicates: this.options.allowDuplicates,
- timeLimit: this.options.timeLimit,
- policyFile: this.options.policyFile,
- buttonImage: this.options.buttonImage
- });
- this.loaded = true;
- this.appendCookieData();
- },
- targetRelay: function(name) {
- if (this.target) this.target.fireEvent(name);
- },
- reposition: function(coords) {
- // update coordinates, manual or automatically
- coords = coords || (this.target && this.target.offsetHeight)
- ? this.target.getCoordinates(this.box.getOffsetParent())
- : {top: window.getScrollTop(), left: 0, width: 40, height: 40}
- this.box.setStyles(coords);
- this.fireEvent('reposition', [coords, this.box, this.target]);
- },
- setOptions: function(options) {
- if (options) {
- if (options.url) options.url = Swiff.Uploader.qualifyPath(options.url);
- if (options.buttonImage) options.buttonImage = Swiff.Uploader.qualifyPath(options.buttonImage);
- this.parent(options);
- if (this.loaded) this.remote('xSetOptions', options);
- }
- return this;
- },
- setEnabled: function(status) {
- this.remote('xSetEnabled', status);
- },
- start: function() {
- this.fireEvent('beforeStart');
- this.remote('xStart');
- },
- stop: function() {
- this.fireEvent('beforeStop');
- this.remote('xStop');
- },
- remove: function() {
- this.fireEvent('beforeRemove');
- this.remote('xRemove');
- },
- fileStart: function(file) {
- this.remote('xFileStart', file.id);
- },
- fileStop: function(file) {
- this.remote('xFileStop', file.id);
- },
- fileRemove: function(file) {
- this.remote('xFileRemove', file.id);
- },
- fileRequeue: function(file) {
- this.remote('xFileRequeue', file.id);
- },
- appendCookieData: function() {
- var append = this.options.appendCookieData;
- if (!append) return;
- var hash = {};
- document.cookie.split(/;\s*/).each(function(cookie) {
- cookie = cookie.split('=');
- if (cookie.length == 2) {
- hash[decodeURIComponent(cookie[0])] = decodeURIComponent(cookie[1]);
- }
- });
- var data = this.options.data || {};
- if ($type(append) == 'string') data[append] = hash;
- else Object.append(data, hash);
- this.setOptions({data: data});
- },
- processFiles: function(successraw, failraw, queue) {
- var cls = this.options.fileClass || Swiff.Uploader.File;
- var fail = [], success = [];
- if (successraw) {
- successraw.each(function(data) {
- var ret = new cls(this, data);
- if (!ret.validate()) {
- ret.remove.delay(10, ret);
- fail.push(ret);
- } else {
- this.size += data.size;
- this.fileList.push(ret);
- success.push(ret);
- ret.render();
- }
- }, this);
- this.fireEvent('selectSuccess', [success], 10);
- }
- if (failraw || fail.length) {
- fail.extend((failraw) ? failraw.map(function(data) {
- return new cls(this, data);
- }, this) : []).each(function(file) {
- file.invalidate().render();
- });
- this.fireEvent('selectFail', [fail], 10);
- }
- this.update(queue);
- if (this.options.instantStart && success.length) this.start();
- }
- });
- Object.append(Swiff.Uploader, {
- STATUS_QUEUED: 0,
- STATUS_RUNNING: 1,
- STATUS_ERROR: 2,
- STATUS_COMPLETE: 3,
- STATUS_STOPPED: 4,
- log: function() {
- if (window.console && console.info) console.info.apply(console, arguments);
- },
- unitLabels: {
- b: [{min: 1, unit: 'B'}, {min: 1024, unit: 'kB'}, {min: 1048576, unit: 'MB'}, {min: 1073741824, unit: 'GB'}],
- s: [{min: 1, unit: 's'}, {min: 60, unit: 'm'}, {min: 3600, unit: 'h'}, {min: 86400, unit: 'd'}]
- },
- formatUnit: function(base, type, join) {
- var labels = Swiff.Uploader.unitLabels[(type == 'bps') ? 'b' : type];
- var append = (type == 'bps') ? '/s' : '';
- var i, l = labels.length, value;
- if (base < 1) return '0 ' + labels[0].unit + append;
- if (type == 's') {
- var units = [];
- for (i = l - 1; i >= 0; i--) {
- value = Math.floor(base / labels[i].min);
- if (value) {
- units.push(value + ' ' + labels[i].unit);
- base -= value * labels[i].min;
- if (!base) break;
- }
- }
- return (join === false) ? units : units.join(join || ', ');
- }
- for (i = l - 1; i >= 0; i--) {
- value = labels[i].min;
- if (base >= value) break;
- }
- return (base / value).toFixed(1) + ' ' + labels[i].unit + append;
- }
- });
- Swiff.Uploader.qualifyPath = (function() {
- var anchor;
- return function(path) {
- (anchor || (anchor = new Element('a'))).href = path;
- return anchor.href;
- };
- })();
- Swiff.Uploader.File = new Class({
- Implements: Events,
- initialize: function(base, data) {
- this.base = base;
- this.update(data);
- },
- update: function(data) {
- return Object.append(this, data);
- },
- validate: function() {
- var options = this.base.options;
- if (options.fileListMax && this.base.fileList.length >= options.fileListMax) {
- this.validationError = 'fileListMax';
- return false;
- }
- if (options.fileListSizeMax && (this.base.size + this.size) > options.fileListSizeMax) {
- this.validationError = 'fileListSizeMax';
- return false;
- }
- return true;
- },
- invalidate: function() {
- this.invalid = true;
- this.base.fireEvent('fileInvalid', this, 10);
- return this.fireEvent('invalid', this, 10);
- },
- render: function() {
- return this;
- },
- setOptions: function(options) {
- if (options) {
- if (options.url) options.url = Swiff.Uploader.qualifyPath(options.url);
- this.base.remote('xFileSetOptions', this.id, options);
- this.options = $merge(this.options, options);
- }
- return this;
- },
- start: function() {
- this.base.fileStart(this);
- return this;
- },
- stop: function() {
- this.base.fileStop(this);
- return this;
- },
- remove: function() {
- this.base.fileRemove(this);
- return this;
- },
- requeue: function() {
- this.base.fileRequeue(this);
- }
- });