http://www.tianxiashua.com/Public/moive_play/lxdh.js

(function (root, factory) {
var modules = {},
_require = function (deps, callback) {
var args, len, i;
if (typeof deps === 'string') {
return getModule(deps);
} else {
args = [];
for (len = deps.length, i = ; i < len; i++) {
args.push(getModule(deps[i]));
}
return callback.apply(null, args);
}
},
_define = function (id, deps, factory) {
if (arguments.length === ) {
factory = deps;
deps = null;
}
_require(deps || [], function () {
setModule(id, factory, arguments);
});
},
setModule = function (id, factory, args) {
var module = {
exports: factory
},
returned;
if (typeof factory === 'function') {
args.length || (args = [_require, module.exports, module]);
returned = factory.apply(null, args);
returned !== undefined && (module.exports = returned);
}
modules[id] = module.exports;
},
getModule = function (id) {
var module = modules[id] || root[id];
if (!module) {
throw new Error('`' + id + '` is undefined');
}
return module;
},
exportsTo = function (obj) {
var key, host, parts, part, last, ucFirst;
ucFirst = function (str) {
return str && (str.charAt().toUpperCase() + str.substr());
};
for (key in modules) {
host = obj;
if (!modules.hasOwnProperty(key)) {
continue;
}
parts = key.split('/');
last = ucFirst(parts.pop());
while ((part = ucFirst(parts.shift()))) {
host[part] = host[part] || {};
host = host[part];
}
host[last] = modules[key];
}
return obj;
},
makeExport = function (dollar) {
root.__dollar = dollar;
return exportsTo(factory(root, _define, _require));
},
origin;
if (typeof module === 'object' && typeof module.exports === 'object') {
module.exports = makeExport();
} else if (typeof define === 'function' && define.amd) {
define(['jquery'], makeExport);
} else {
origin = root.WebUploader;
root.WebUploader = makeExport();
root.WebUploader.noConflict = function () {
root.WebUploader = origin;
};
}
})(window, function (window, define, require) {
define('dollar-third', [], function () {
var $ = window.__dollar || window.jQuery || window.Zepto;
if (!$) {
throw new Error('jQuery or Zepto not found!');
}
return $;
});
define('dollar', ['dollar-third'], function (_) {
return _;
});
define('promise-builtin', ['dollar'], function ($) {
var api; function Callbacks(once) {
var list = [],
stack = !once && [],
fire = function (data) {
memory = data;
fired = true;
firingIndex = firingStart || ;
firingStart = ;
firingLength = list.length;
firing = true;
for (; list && firingIndex < firingLength; firingIndex++) {
list[firingIndex].apply(data[], data[]);
}
firing = false;
if (list) {
if (stack) {
stack.length && fire(stack.shift());
} else {
list = [];
}
}
},
self = {
add: function () {
if (list) {
var start = list.length;
(function add(args) {
$.each(args, function (_, arg) {
var type = $.type(arg);
if (type === 'function') {
list.push(arg);
} else if (arg && arg.length && type !== 'string') {
add(arg);
}
});
})(arguments);
if (firing) {
firingLength = list.length;
} else if (memory) {
firingStart = start;
fire(memory);
}
}
return this;
},
disable: function () {
list = stack = memory = undefined;
return this;
},
lock: function () {
stack = undefined;
if (!memory) {
self.disable();
}
return this;
},
fireWith: function (context, args) {
if (list && (!fired || stack)) {
args = args || [];
args = [context, args.slice ? args.slice() : args];
if (firing) {
stack.push(args);
} else {
fire(args);
}
}
return this;
},
fire: function () {
self.fireWith(this, arguments);
return this;
}
},
fired, firing, firingStart, firingLength, firingIndex, memory;
return self;
} function Deferred(func) {
var tuples = [
['resolve', 'done', Callbacks(true), 'resolved'],
['reject', 'fail', Callbacks(true), 'rejected'],
['notify', 'progress', Callbacks()]
],
state = 'pending',
promise = {
state: function () {
return state;
},
always: function () {
deferred.done(arguments).fail(arguments);
return this;
},
then: function () {
var fns = arguments;
return Deferred(function (newDefer) {
$.each(tuples, function (i, tuple) {
var action = tuple[],
fn = $.isFunction(fns[i]) && fns[i];
deferred[tuple[]](function () {
var returned;
returned = fn && fn.apply(this, arguments);
if (returned && $.isFunction(returned.promise)) {
returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify);
} else {
newDefer[action + 'With'](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
}
});
});
fns = null;
}).promise();
},
promise: function (obj) {
return obj != null ? $.extend(obj, promise) : promise;
}
},
deferred = {};
promise.pipe = promise.then;
$.each(tuples, function (i, tuple) {
var list = tuple[],
stateString = tuple[];
promise[tuple[]] = list.add;
if (stateString) {
list.add(function () {
state = stateString;
}, tuples[i ^ ][].disable, tuples[][].lock);
}
deferred[tuple[]] = function () {
deferred[tuple[] + 'With'](this === deferred ? promise : this, arguments);
return this;
};
deferred[tuple[] + 'With'] = list.fireWith;
});
promise.promise(deferred);
if (func) {
func.call(deferred, deferred);
}
return deferred;
}
api = {
Deferred: Deferred,
isPromise: function (anything) {
return anything && typeof anything.then === 'function';
},
when: function (subordinate) {
var i = ,
slice = [].slice,
resolveValues = slice.call(arguments),
length = resolveValues.length,
remaining = length !== || (subordinate && $.isFunction(subordinate.promise)) ? length : ,
deferred = remaining === ? subordinate : Deferred(),
updateFunc = function (i, contexts, values) {
return function (value) {
contexts[i] = this;
values[i] = arguments.length > ? slice.call(arguments) : value;
if (values === progressValues) {
deferred.notifyWith(contexts, values);
} else if (!(--remaining)) {
deferred.resolveWith(contexts, values);
}
};
},
progressValues, progressContexts, resolveContexts;
if (length > ) {
progressValues = new Array(length);
progressContexts = new Array(length);
resolveContexts = new Array(length);
for (; i < length; i++) {
if (resolveValues[i] && $.isFunction(resolveValues[i].promise)) {
resolveValues[i].promise().done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFunc(i, progressContexts, progressValues));
} else {
--remaining;
}
}
}
if (!remaining) {
deferred.resolveWith(resolveContexts, resolveValues);
}
return deferred.promise();
}
};
return api;
});
define('promise', ['promise-builtin'], function ($) {
return $;
});
define('base', ['dollar', 'promise'], function ($, promise) {
var noop = function () {},
call = Function.call; function uncurryThis(fn) {
return function () {
return call.apply(fn, arguments);
};
} function bindFn(fn, context) {
return function () {
return fn.apply(context, arguments);
};
} function createObject(proto) {
var f;
if (Object.create) {
return Object.create(proto);
} else {
f = function () {};
f.prototype = proto;
return new f();
}
}
return {
version: '0.1.5',
$: $,
Deferred: promise.Deferred,
isPromise: promise.isPromise,
when: promise.when,
browser: (function (ua) {
var ret = {},
webkit = ua.match(/WebKit\/([\d.]+)/),
chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/),
ie = ua.match(/MSIE\s([\d\.]+)/) || ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
firefox = ua.match(/Firefox\/([\d.]+)/),
safari = ua.match(/Safari\/([\d.]+)/),
opera = ua.match(/OPR\/([\d.]+)/);
webkit && (ret.webkit = parseFloat(webkit[]));
chrome && (ret.chrome = parseFloat(chrome[]));
ie && (ret.ie = parseFloat(ie[]));
firefox && (ret.firefox = parseFloat(firefox[]));
safari && (ret.safari = parseFloat(safari[]));
opera && (ret.opera = parseFloat(opera[]));
return ret;
})(navigator.userAgent),
os: (function (ua) {
var ret = {},
android = ua.match(/(?:Android);?[\s\/]+([\d.]+)?/),
ios = ua.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);
android && (ret.android = parseFloat(android[]));
ios && (ret.ios = parseFloat(ios[].replace(/_/g, '.')));
return ret;
})(navigator.userAgent),
inherits: function (Super, protos, staticProtos) {
var child;
if (typeof protos === 'function') {
child = protos;
protos = null;
} else if (protos && protos.hasOwnProperty('constructor')) {
child = protos.constructor;
} else {
child = function () {
return Super.apply(this, arguments);
};
}
$.extend(true, child, Super, staticProtos || {});
child.__super__ = Super.prototype;
child.prototype = createObject(Super.prototype);
protos && $.extend(true, child.prototype, protos);
return child;
},
noop: noop,
bindFn: bindFn,
log: (function () {
if (window.console) {
return bindFn(console.log, console);
}
return noop;
})(),
nextTick: (function () {
return function (cb) {
setTimeout(cb, );
};
})(),
slice: uncurryThis([].slice),
guid: (function () {
var counter = ;
return function (prefix) {
var guid = (+new Date()).toString(),
i = ;
for (; i < ; i++) {
guid += Math.floor(Math.random() * ).toString();
}
return (prefix || 'wu_') + guid + (counter++).toString();
};
})(),
formatSize: function (size, pointLength, units) {
var unit;
units = units || ['B', 'K', 'M', 'G', 'TB'];
while ((unit = units.shift()) && size > ) {
size = size / ;
}
return (unit === 'B' ? size : size.toFixed(pointLength || )) +
unit;
}
};
});
define('mediator', ['base'], function (Base) {
var $ = Base.$,
slice = [].slice,
separator = /\s+/,
protos; function findHandlers(arr, name, callback, context) {
return $.grep(arr, function (handler) {
return handler && (!name || handler.e === name) && (!callback || handler.cb === callback || handler.cb._cb === callback) && (!context || handler.ctx === context);
});
} function eachEvent(events, callback, iterator) {
$.each((events || '').split(separator), function (_, key) {
iterator(key, callback);
});
} function triggerHanders(events, args) {
var stoped = false,
i = -,
len = events.length,
handler;
while (++i < len) {
handler = events[i];
if (handler.cb.apply(handler.ctx2, args) === false) {
stoped = true;
break;
}
}
return !stoped;
}
protos = {
on: function (name, callback, context) {
var me = this,
set;
if (!callback) {
return this;
}
set = this._events || (this._events = []);
eachEvent(name, callback, function (name, callback) {
var handler = {
e: name
};
handler.cb = callback;
handler.ctx = context;
handler.ctx2 = context || me;
handler.id = set.length;
set.push(handler);
});
return this;
},
once: function (name, callback, context) {
var me = this;
if (!callback) {
return me;
}
eachEvent(name, callback, function (name, callback) {
var once = function () {
me.off(name, once);
return callback.apply(context || me, arguments);
};
once._cb = callback;
me.on(name, once, context);
});
return me;
},
off: function (name, cb, ctx) {
var events = this._events;
if (!events) {
return this;
}
if (!name && !cb && !ctx) {
this._events = [];
return this;
}
eachEvent(name, cb, function (name, cb) {
$.each(findHandlers(events, name, cb, ctx), function () {
delete events[this.id];
});
});
return this;
},
trigger: function (type) {
var args, events, allEvents;
if (!this._events || !type) {
return this;
}
args = slice.call(arguments, );
events = findHandlers(this._events, type);
allEvents = findHandlers(this._events, 'all');
return triggerHanders(events, args) && triggerHanders(allEvents, arguments);
}
};
return $.extend({
installTo: function (obj) {
return $.extend(obj, protos);
}
}, protos);
});
define('uploader', ['base', 'mediator'], function (Base, Mediator) {
var $ = Base.$; function Uploader(opts) {
this.options = $.extend(true, {}, Uploader.options, opts);
this._init(this.options);
}
Uploader.options = {};
Mediator.installTo(Uploader.prototype);
$.each({
upload: 'start-upload',
stop: 'stop-upload',
getFile: 'get-file',
getFiles: 'get-files',
addFile: 'add-file',
addFiles: 'add-file',
sort: 'sort-files',
removeFile: 'remove-file',
cancelFile: 'cancel-file',
skipFile: 'skip-file',
retry: 'retry',
isInProgress: 'is-in-progress',
makeThumb: 'make-thumb',
md5File: 'md5-file',
getDimension: 'get-dimension',
addButton: 'add-btn',
predictRuntimeType: 'predict-runtime-type',
refresh: 'refresh',
disable: 'disable',
enable: 'enable',
reset: 'reset'
}, function (fn, command) {
Uploader.prototype[fn] = function () {
return this.request(command, arguments);
};
});
$.extend(Uploader.prototype, {
state: 'pending',
_init: function (opts) {
var me = this;
me.request('init', opts, function () {
me.state = 'ready';
me.trigger('ready');
});
},
option: function (key, val) {
var opts = this.options;
if (arguments.length > ) {
if ($.isPlainObject(val) && $.isPlainObject(opts[key])) {
$.extend(opts[key], val);
} else {
opts[key] = val;
}
} else {
return key ? opts[key] : opts;
}
},
getStats: function () {
var stats = this.request('get-stats');
return stats ? {
successNum: stats.numOfSuccess,
progressNum: stats.numOfProgress,
cancelNum: stats.numOfCancel,
invalidNum: stats.numOfInvalid,
uploadFailNum: stats.numOfUploadFailed,
queueNum: stats.numOfQueue,
interruptNum: stats.numofInterrupt
} : {};
},
trigger: function (type) {
var args = [].slice.call(arguments, ),
opts = this.options,
name = 'on' + type.substring(, ).toUpperCase() +
type.substring();
if (Mediator.trigger.apply(this, arguments) === false || $.isFunction(opts[name]) && opts[name].apply(this, args) === false || $.isFunction(this[name]) && this[name].apply(this, args) === false || Mediator.trigger.apply(Mediator, [this, type].concat(args)) === false) {
return false;
}
return true;
},
destroy: function () {
this.request('destroy', arguments);
this.off();
},
request: Base.noop
});
Base.create = Uploader.create = function (opts) {
return new Uploader(opts);
};
Base.Uploader = Uploader;
return Uploader;
});
define('runtime/runtime', ['base', 'mediator'], function (Base, Mediator) {
var $ = Base.$,
factories = {},
getFirstKey = function (obj) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
return key;
}
}
return null;
}; function Runtime(options) {
this.options = $.extend({
container: document.body
}, options);
this.uid = Base.guid('rt_');
}
$.extend(Runtime.prototype, {
getContainer: function () {
var opts = this.options,
parent, container;
if (this._container) {
return this._container;
}
parent = $(opts.container || document.body);
container = $(document.createElement('div'));
container.attr('id', 'rt_' + this.uid);
container.css({
position: 'absolute',
top: '0px',
left: '0px',
width: '1px',
height: '1px',
overflow: 'hidden'
});
parent.append(container);
parent.addClass('webuploader-container');
this._container = container;
this._parent = parent;
return container;
},
init: Base.noop,
exec: Base.noop,
destroy: function () {
this._container && this._container.remove();
this._parent && this._parent.removeClass('webuploader-container');
this.off();
}
});
Runtime.orders = 'html5,flash';
Runtime.addRuntime = function (type, factory) {
factories[type] = factory;
};
Runtime.hasRuntime = function (type) {
return !!(type ? factories[type] : getFirstKey(factories));
};
Runtime.create = function (opts, orders) {
var type, runtime;
orders = orders || Runtime.orders;
$.each(orders.split(/\s*,\s*/g), function () {
if (factories[this]) {
type = this;
return false;
}
});
type = type || getFirstKey(factories);
if (!type) {
throw new Error('Runtime Error');
}
runtime = new factories[type](opts);
return runtime;
};
Mediator.installTo(Runtime.prototype);
return Runtime;
});
define('runtime/client', ['base', 'mediator', 'runtime/runtime'], function (Base, Mediator, Runtime) {
var cache;
cache = (function () {
var obj = {};
return {
add: function (runtime) {
obj[runtime.uid] = runtime;
},
get: function (ruid, standalone) {
var i;
if (ruid) {
return obj[ruid];
}
for (i in obj) {
if (standalone && obj[i].__standalone) {
continue;
}
return obj[i];
}
return null;
},
remove: function (runtime) {
delete obj[runtime.uid];
}
};
})(); function RuntimeClient(component, standalone) {
var deferred = Base.Deferred(),
runtime;
this.uid = Base.guid('client_');
this.runtimeReady = function (cb) {
return deferred.done(cb);
};
this.connectRuntime = function (opts, cb) {
if (runtime) {
throw new Error('already connected!');
}
deferred.done(cb);
if (typeof opts === 'string' && cache.get(opts)) {
runtime = cache.get(opts);
}
runtime = runtime || cache.get(null, standalone);
if (!runtime) {
runtime = Runtime.create(opts, opts.runtimeOrder);
runtime.__promise = deferred.promise();
runtime.once('ready', deferred.resolve);
runtime.init();
cache.add(runtime);
runtime.__client = ;
} else {
Base.$.extend(runtime.options, opts);
runtime.__promise.then(deferred.resolve);
runtime.__client++;
}
standalone && (runtime.__standalone = standalone);
return runtime;
};
this.getRuntime = function () {
return runtime;
};
this.disconnectRuntime = function () {
if (!runtime) {
return;
}
runtime.__client--;
if (runtime.__client <= ) {
cache.remove(runtime);
delete runtime.__promise;
runtime.destroy();
}
runtime = null;
};
this.exec = function () {
if (!runtime) {
return;
}
var args = Base.slice(arguments);
component && args.unshift(component);
return runtime.exec.apply(this, args);
};
this.getRuid = function () {
return runtime && runtime.uid;
};
this.destroy = (function (destroy) {
return function () {
destroy && destroy.apply(this, arguments);
this.trigger('destroy');
this.off();
this.exec('destroy');
this.disconnectRuntime();
};
})(this.destroy);
}
Mediator.installTo(RuntimeClient.prototype);
return RuntimeClient;
});
define('lib/blob', ['base', 'runtime/client'], function (Base, RuntimeClient) {
function Blob(ruid, source) {
var me = this;
me.source = source;
me.ruid = ruid;
this.size = source.size || ;
if (!source.type && this.ext && ~'jpg,jpeg,png,gif,bmp'.indexOf(this.ext)) {
this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
} else {
this.type = source.type || 'application/octet-stream';
}
RuntimeClient.call(me, 'Blob');
this.uid = source.uid || this.uid;
if (ruid) {
me.connectRuntime(ruid);
}
}
Base.inherits(RuntimeClient, {
constructor: Blob,
slice: function (start, end) {
return this.exec('slice', start, end);
},
getSource: function () {
return this.source;
}
});
return Blob;
});
define('lib/file', ['base', 'lib/blob'], function (Base, Blob) {
var uid = ,
rExt = /\.([^.]+)$/; function File(ruid, file) {
var ext;
this.name = file.name || ('untitled' + uid++);
ext = rExt.exec(file.name) ? RegExp.$.toLowerCase() : '';
if (!ext && file.type) {
ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec(file.type) ? RegExp.$.toLowerCase() : '';
this.name += '.' + ext;
}
this.ext = ext;
this.lastModifiedDate = file.lastModifiedDate || (new Date()).toLocaleString();
Blob.apply(this, arguments);
}
return Base.inherits(Blob, File);
});
define('lib/filepicker', ['base', 'runtime/client', 'lib/file'], function (Base, RuntimeClent, File) {
var $ = Base.$; function FilePicker(opts) {
opts = this.options = $.extend({}, FilePicker.options, opts);
opts.container = $(opts.id);
if (!opts.container.length) {
throw new Error('按钮指定错误');
}
opts.innerHTML = opts.innerHTML || opts.label || opts.container.html() || '';
opts.button = $(opts.button || document.createElement('div'));
opts.button.html(opts.innerHTML);
opts.container.html(opts.button);
RuntimeClent.call(this, 'FilePicker', true);
}
FilePicker.options = {
button: null,
container: null,
label: null,
innerHTML: null,
multiple: true,
accept: null,
name: 'file'
};
Base.inherits(RuntimeClent, {
constructor: FilePicker,
init: function () {
var me = this,
opts = me.options,
button = opts.button;
button.addClass('webuploader-pick');
me.on('all', function (type) {
var files;
switch (type) {
case 'mouseenter':
button.addClass('webuploader-pick-hover');
break;
case 'mouseleave':
button.removeClass('webuploader-pick-hover');
break;
case 'change':
files = me.exec('getFiles');
me.trigger('select', $.map(files, function (file) {
file = new File(me.getRuid(), file);
file._refer = opts.container;
return file;
}), opts.container);
break;
}
});
me.connectRuntime(opts, function () {
me.refresh();
me.exec('init', opts);
me.trigger('ready');
});
this._resizeHandler = Base.bindFn(this.refresh, this);
$(window).on('resize', this._resizeHandler);
},
refresh: function () {
var shimContainer = this.getRuntime().getContainer(),
button = this.options.button,
width = button.outerWidth ? button.outerWidth() : button.width(),
height = button.outerHeight ? button.outerHeight() : button.height(),
pos = button.offset();
width && height && shimContainer.css({
bottom: 'auto',
right: 'auto',
width: width + 'px',
height: height + 'px'
}).offset(pos);
},
enable: function () {
var btn = this.options.button;
btn.removeClass('webuploader-pick-disable');
this.refresh();
},
disable: function () {
var btn = this.options.button;
this.getRuntime().getContainer().css({
top: '-99999px'
});
btn.addClass('webuploader-pick-disable');
},
destroy: function () {
var btn = this.options.button;
$(window).off('resize', this._resizeHandler);
btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' + 'webuploader-pick');
}
});
return FilePicker;
});
define('widgets/widget', ['base', 'uploader'], function (Base, Uploader) {
var $ = Base.$,
_init = Uploader.prototype._init,
_destroy = Uploader.prototype.destroy,
IGNORE = {},
widgetClass = []; function isArrayLike(obj) {
if (!obj) {
return false;
}
var length = obj.length,
type = $.type(obj);
if (obj.nodeType === && length) {
return true;
}
return type === 'array' || type !== 'function' && type !== 'string' && (length === || typeof length === 'number' && length > && (length - ) in obj);
} function Widget(uploader) {
this.owner = uploader;
this.options = uploader.options;
}
$.extend(Widget.prototype, {
init: Base.noop,
invoke: function (apiName, args) {
var map = this.responseMap;
if (!map || !(apiName in map) || !(map[apiName] in this) || !$.isFunction(this[map[apiName]])) {
return IGNORE;
}
return this[map[apiName]].apply(this, args);
},
request: function () {
return this.owner.request.apply(this.owner, arguments);
}
});
$.extend(Uploader.prototype, {
_init: function () {
var me = this,
widgets = me._widgets = [],
deactives = me.options.disableWidgets || '';
$.each(widgetClass, function (_, klass) {
(!deactives || !~deactives.indexOf(klass._name)) && widgets.push(new klass(me));
});
return _init.apply(me, arguments);
},
request: function (apiName, args, callback) {
var i = ,
widgets = this._widgets,
len = widgets && widgets.length,
rlts = [],
dfds = [],
widget, rlt, promise, key;
args = isArrayLike(args) ? args : [args];
for (; i < len; i++) {
widget = widgets[i];
rlt = widget.invoke(apiName, args);
if (rlt !== IGNORE) {
if (Base.isPromise(rlt)) {
dfds.push(rlt);
} else {
rlts.push(rlt);
}
}
}
if (callback || dfds.length) {
promise = Base.when.apply(Base, dfds);
key = promise.pipe ? 'pipe' : 'then';
return promise[key](function () {
var deferred = Base.Deferred(),
args = arguments;
if (args.length === ) {
args = args[];
}
setTimeout(function () {
deferred.resolve(args);
}, );
return deferred.promise();
})[callback ? key : 'done'](callback || Base.noop);
} else {
return rlts[];
}
},
destroy: function () {
_destroy.apply(this, arguments);
this._widgets = null;
}
});
Uploader.register = Widget.register = function (responseMap, widgetProto) {
var map = {
init: 'init',
destroy: 'destroy',
name: 'anonymous'
},
klass;
if (arguments.length === ) {
widgetProto = responseMap;
$.each(widgetProto, function (key) {
if (key[] === '_' || key === 'name') {
key === 'name' && (map.name = widgetProto.name);
return;
}
map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
});
} else {
map = $.extend(map, responseMap);
}
widgetProto.responseMap = map;
klass = Base.inherits(Widget, widgetProto);
klass._name = map.name;
widgetClass.push(klass);
return klass;
};
Uploader.unRegister = Widget.unRegister = function (name) {
if (!name || name === 'anonymous') {
return;
}
for (var i = widgetClass.length; i--;) {
if (widgetClass[i]._name === name) {
widgetClass.splice(i, )
}
}
};
return Widget;
});
define('widgets/filepicker', ['base', 'uploader', 'lib/filepicker', 'widgets/widget'], function (Base, Uploader, FilePicker) {
var $ = Base.$;
$.extend(Uploader.options, {
pick: null,
accept: null
});
return Uploader.register({
name: 'picker',
init: function (opts) {
this.pickers = [];
return opts.pick && this.addBtn(opts.pick);
},
refresh: function () {
$.each(this.pickers, function () {
this.refresh();
});
},
addBtn: function (pick) {
var me = this,
opts = me.options,
accept = opts.accept,
promises = [];
if (!pick) {
return;
}
$.isPlainObject(pick) || (pick = {
id: pick
});
$(pick.id).each(function () {
var options, picker, deferred;
deferred = Base.Deferred();
options = $.extend({}, pick, {
accept: $.isPlainObject(accept) ? [accept] : accept,
swf: opts.swf,
runtimeOrder: opts.runtimeOrder,
id: this
});
picker = new FilePicker(options);
picker.once('ready', deferred.resolve);
picker.on('select', function (files) {
me.owner.request('add-file', [files]);
});
picker.init();
me.pickers.push(picker);
promises.push(deferred.promise());
});
return Base.when.apply(Base, promises);
},
disable: function () {
$.each(this.pickers, function () {
this.disable();
});
},
enable: function () {
$.each(this.pickers, function () {
this.enable();
});
},
destroy: function () {
$.each(this.pickers, function () {
this.destroy();
});
this.pickers = null;
}
});
});
define('lib/image', ['base', 'runtime/client', 'lib/blob'], function (Base, RuntimeClient, Blob) {
var $ = Base.$; function Image(opts) {
this.options = $.extend({}, Image.options, opts);
RuntimeClient.call(this, 'Image');
this.on('load', function () {
this._info = this.exec('info');
this._meta = this.exec('meta');
});
}
Image.options = {
quality: ,
crop: false,
preserveHeaders: false,
allowMagnify: false
};
Base.inherits(RuntimeClient, {
constructor: Image,
info: function (val) {
if (val) {
this._info = val;
return this;
}
return this._info;
},
meta: function (val) {
if (val) {
this._meta = val;
return this;
}
return this._meta;
},
loadFromBlob: function (blob) {
var me = this,
ruid = blob.getRuid();
this.connectRuntime(ruid, function () {
me.exec('init', me.options);
me.exec('loadFromBlob', blob);
});
},
resize: function () {
var args = Base.slice(arguments);
return this.exec.apply(this, ['resize'].concat(args));
},
crop: function () {
var args = Base.slice(arguments);
return this.exec.apply(this, ['crop'].concat(args));
},
getAsDataUrl: function (type) {
return this.exec('getAsDataUrl', type);
},
getAsBlob: function (type) {
var blob = this.exec('getAsBlob', type);
return new Blob(this.getRuid(), blob);
}
});
return Image;
});
define('widgets/image', ['base', 'uploader', 'lib/image', 'widgets/widget'], function (Base, Uploader, Image) {
var $ = Base.$,
throttle;
throttle = (function (max) {
var occupied = ,
waiting = [],
tick = function () {
var item;
while (waiting.length && occupied < max) {
item = waiting.shift();
occupied += item[];
item[]();
}
};
return function (emiter, size, cb) {
waiting.push([size, cb]);
emiter.once('destroy', function () {
occupied -= size;
setTimeout(tick, );
});
setTimeout(tick, );
};
})( * * );
$.extend(Uploader.options, {
thumb: {
width: ,
height: ,
quality: ,
allowMagnify: true,
crop: true,
preserveHeaders: false,
type: 'image/jpeg'
},
compress: {
width: ,
height: ,
quality: ,
allowMagnify: false,
crop: false,
preserveHeaders: true
}
});
return Uploader.register({
name: 'image',
makeThumb: function (file, cb, width, height) {
var opts, image;
file = this.request('get-file', file);
if (!file.type.match(/^image/)) {
cb(true);
return;
}
opts = $.extend({}, this.options.thumb);
if ($.isPlainObject(width)) {
opts = $.extend(opts, width);
width = null;
}
width = width || opts.width;
height = height || opts.height;
image = new Image(opts);
image.once('load', function () {
file._info = file._info || image.info();
file._meta = file._meta || image.meta();
if (width <= && width > ) {
width = file._info.width * width;
}
if (height <= && height > ) {
height = file._info.height * height;
}
image.resize(width, height);
});
image.once('complete', function () {
cb(false, image.getAsDataUrl(opts.type));
image.destroy();
});
image.once('error', function (reason) {
cb(reason || true);
image.destroy();
});
throttle(image, file.source.size, function () {
file._info && image.info(file._info);
file._meta && image.meta(file._meta);
image.loadFromBlob(file.source);
});
},
beforeSendFile: function (file) {
var opts = this.options.compress || this.options.resize,
compressSize = opts && opts.compressSize || ,
noCompressIfLarger = opts && opts.noCompressIfLarger || false,
image, deferred;
file = this.request('get-file', file);
if (!opts || !~'image/jpeg,image/jpg'.indexOf(file.type) || file.size < compressSize || file._compressed) {
return;
}
opts = $.extend({}, opts);
deferred = Base.Deferred();
image = new Image(opts);
deferred.always(function () {
image.destroy();
image = null;
});
image.once('error', deferred.reject);
image.once('load', function () {
var width = opts.width,
height = opts.height;
file._info = file._info || image.info();
file._meta = file._meta || image.meta();
if (width <= && width > ) {
width = file._info.width * width;
}
if (height <= && height > ) {
height = file._info.height * height;
}
image.resize(width, height);
});
image.once('complete', function () {
var blob, size;
try {
blob = image.getAsBlob(opts.type);
size = file.size;
if (!noCompressIfLarger || blob.size < size) {
file.source = blob;
file.size = blob.size;
file.trigger('resize', blob.size, size);
}
file._compressed = true;
deferred.resolve();
} catch (e) {
deferred.resolve();
}
});
file._info && image.info(file._info);
file._meta && image.meta(file._meta);
image.loadFromBlob(file.source);
return deferred.promise();
}
});
});
define('file', ['base', 'mediator'], function (Base, Mediator) {
var $ = Base.$,
idPrefix = 'WU_FILE_',
idSuffix = ,
rExt = /\.([^.]+)$/,
statusMap = {}; function gid() {
return idPrefix + idSuffix++;
} function WUFile(source) {
this.name = source.name || 'Untitled';
this.size = source.size || ;
this.type = source.type || 'application/octet-stream';
this.lastModifiedDate = source.lastModifiedDate || (new Date() * );
this.id = gid();
this.ext = rExt.exec(this.name) ? RegExp.$ : '';
this.statusText = '';
statusMap[this.id] = WUFile.Status.INITED;
this.source = source;
this.loaded = ;
this.on('error', function (msg) {
this.setStatus(WUFile.Status.ERROR, msg);
});
}
$.extend(WUFile.prototype, {
setStatus: function (status, text) {
var prevStatus = statusMap[this.id];
typeof text !== 'undefined' && (this.statusText = text);
if (status !== prevStatus) {
statusMap[this.id] = status;
this.trigger('statuschange', status, prevStatus);
}
},
getStatus: function () {
return statusMap[this.id];
},
getSource: function () {
return this.source;
},
destroy: function () {
this.off();
delete statusMap[this.id];
}
});
Mediator.installTo(WUFile.prototype);
WUFile.Status = {
INITED: 'inited',
QUEUED: 'queued',
PROGRESS: 'progress',
ERROR: 'error',
COMPLETE: 'complete',
CANCELLED: 'cancelled',
INTERRUPT: 'interrupt',
INVALID: 'invalid'
};
return WUFile;
});
define('queue', ['base', 'mediator', 'file'], function (Base, Mediator, WUFile) {
var $ = Base.$,
STATUS = WUFile.Status; function Queue() {
this.stats = {
numOfQueue: ,
numOfSuccess: ,
numOfCancel: ,
numOfProgress: ,
numOfUploadFailed: ,
numOfInvalid: ,
numofDeleted: ,
numofInterrupt:
};
this._queue = [];
this._map = {};
}
$.extend(Queue.prototype, {
append: function (file) {
this._queue.push(file);
this._fileAdded(file);
return this;
},
prepend: function (file) {
this._queue.unshift(file);
this._fileAdded(file);
return this;
},
getFile: function (fileId) {
if (typeof fileId !== 'string') {
return fileId;
}
return this._map[fileId];
},
fetch: function (status) {
var len = this._queue.length,
i, file;
status = status || STATUS.QUEUED;
for (i = ; i < len; i++) {
file = this._queue[i];
if (status === file.getStatus()) {
return file;
}
}
return null;
},
sort: function (fn) {
if (typeof fn === 'function') {
this._queue.sort(fn);
}
},
getFiles: function () {
var sts = [].slice.call(arguments, ),
ret = [],
i = ,
len = this._queue.length,
file;
for (; i < len; i++) {
file = this._queue[i];
if (sts.length && !~$.inArray(file.getStatus(), sts)) {
continue;
}
ret.push(file);
}
return ret;
},
removeFile: function (file) {
var me = this,
existing = this._map[file.id];
if (existing) {
delete this._map[file.id];
file.destroy();
this.stats.numofDeleted++;
}
},
_fileAdded: function (file) {
var me = this,
existing = this._map[file.id];
if (!existing) {
this._map[file.id] = file;
file.on('statuschange', function (cur, pre) {
me._onFileStatusChange(cur, pre);
});
}
},
_onFileStatusChange: function (curStatus, preStatus) {
var stats = this.stats;
switch (preStatus) {
case STATUS.PROGRESS:
stats.numOfProgress--;
break;
case STATUS.QUEUED:
stats.numOfQueue--;
break;
case STATUS.ERROR:
stats.numOfUploadFailed--;
break;
case STATUS.INVALID:
stats.numOfInvalid--;
break;
case STATUS.INTERRUPT:
stats.numofInterrupt--;
break;
}
switch (curStatus) {
case STATUS.QUEUED:
stats.numOfQueue++;
break;
case STATUS.PROGRESS:
stats.numOfProgress++;
break;
case STATUS.ERROR:
stats.numOfUploadFailed++;
break;
case STATUS.COMPLETE:
stats.numOfSuccess++;
break;
case STATUS.CANCELLED:
stats.numOfCancel++;
break;
case STATUS.INVALID:
stats.numOfInvalid++;
break;
case STATUS.INTERRUPT:
stats.numofInterrupt++;
break;
}
}
});
Mediator.installTo(Queue.prototype);
return Queue;
});
define('widgets/queue', ['base', 'uploader', 'queue', 'file', 'lib/file', 'runtime/client', 'widgets/widget'], function (Base, Uploader, Queue, WUFile, File, RuntimeClient) {
var $ = Base.$,
rExt = /\.\w+$/,
Status = WUFile.Status;
return Uploader.register({
name: 'queue',
init: function (opts) {
var me = this,
deferred, len, i, item, arr, accept, runtime;
if ($.isPlainObject(opts.accept)) {
opts.accept = [opts.accept];
}
if (opts.accept) {
arr = [];
for (i = , len = opts.accept.length; i < len; i++) {
item = opts.accept[i].extensions;
item && arr.push(item);
}
if (arr.length) {
accept = '\\.' + arr.join(',').replace(/,/g, '$|\\.').replace(/\*/g, '.*') + '$';
}
me.accept = new RegExp(accept, 'i');
}
me.queue = new Queue();
me.stats = me.queue.stats;
if (this.request('predict-runtime-type') !== 'html5') {
return;
}
deferred = Base.Deferred();
this.placeholder = runtime = new RuntimeClient('Placeholder');
runtime.connectRuntime({
runtimeOrder: 'html5'
}, function () {
me._ruid = runtime.getRuid();
deferred.resolve();
});
return deferred.promise();
},
_wrapFile: function (file) {
if (!(file instanceof WUFile)) {
if (!(file instanceof File)) {
if (!this._ruid) {
throw new Error('Can\'t add external files.');
}
file = new File(this._ruid, file);
}
file = new WUFile(file);
}
return file;
},
acceptFile: function (file) {
var invalid = !file || !file.size || this.accept && rExt.exec(file.name) && !this.accept.test(file.name);
return !invalid;
},
_addFile: function (file) {
var me = this;
file = me._wrapFile(file);
if (!me.owner.trigger('beforeFileQueued', file)) {
return;
}
if (!me.acceptFile(file)) {
me.owner.trigger('error', 'Q_TYPE_DENIED', file);
return;
}
me.queue.append(file);
me.owner.trigger('fileQueued', file);
return file;
},
getFile: function (fileId) {
return this.queue.getFile(fileId);
},
addFile: function (files) {
var me = this;
if (!files.length) {
files = [files];
}
files = $.map(files, function (file) {
return me._addFile(file);
});
me.owner.trigger('filesQueued', files);
if (me.options.auto) {
setTimeout(function () {
me.request('start-upload');
}, );
}
},
getStats: function () {
return this.stats;
},
removeFile: function (file, remove) {
var me = this;
file = file.id ? file : me.queue.getFile(file);
this.request('cancel-file', file);
if (remove) {
this.queue.removeFile(file);
}
},
getFiles: function () {
return this.queue.getFiles.apply(this.queue, arguments);
},
fetchFile: function () {
return this.queue.fetch.apply(this.queue, arguments);
},
retry: function (file, noForceStart) {
var me = this,
files, i, len;
if (file) {
file = file.id ? file : me.queue.getFile(file);
file.setStatus(Status.QUEUED);
noForceStart || me.request('start-upload');
return;
}
files = me.queue.getFiles(Status.ERROR);
i = ;
len = files.length;
for (; i < len; i++) {
file = files[i];
file.setStatus(Status.QUEUED);
}
me.request('start-upload');
},
sortFiles: function () {
return this.queue.sort.apply(this.queue, arguments);
},
reset: function () {
this.owner.trigger('reset');
this.queue = new Queue();
this.stats = this.queue.stats;
},
destroy: function () {
this.reset();
this.placeholder && this.placeholder.destroy();
}
});
});
define('widgets/runtime', ['uploader', 'runtime/runtime', 'widgets/widget'], function (Uploader, Runtime) {
Uploader.support = function () {
return Runtime.hasRuntime.apply(Runtime, arguments);
};
return Uploader.register({
name: 'runtime',
init: function () {
if (!this.predictRuntimeType()) {
throw Error('Runtime Error');
}
},
predictRuntimeType: function () {
var orders = this.options.runtimeOrder || Runtime.orders,
type = this.type,
i, len;
if (!type) {
orders = orders.split(/\s*,\s*/g);
for (i = , len = orders.length; i < len; i++) {
if (Runtime.hasRuntime(orders[i])) {
this.type = type = orders[i];
break;
}
}
}
return type;
}
});
});
define('lib/transport', ['base', 'runtime/client', 'mediator'], function (Base, RuntimeClient, Mediator) {
var $ = Base.$; function Transport(opts) {
var me = this;
opts = me.options = $.extend(true, {}, Transport.options, opts || {});
RuntimeClient.call(this, 'Transport');
this._blob = null;
this._formData = opts.formData || {};
this._headers = opts.headers || {};
this.on('progress', this._timeout);
this.on('load error', function () {
me.trigger('progress', );
clearTimeout(me._timer);
});
}
Transport.options = {
server: '',
method: 'POST',
withCredentials: false,
fileVal: 'file',
timeout: * * ,
formData: {},
headers: {},
sendAsBinary: false
};
$.extend(Transport.prototype, {
appendBlob: function (key, blob, filename) {
var me = this,
opts = me.options;
if (me.getRuid()) {
me.disconnectRuntime();
}
me.connectRuntime(blob.ruid, function () {
me.exec('init');
});
me._blob = blob;
opts.fileVal = key || opts.fileVal;
opts.filename = filename || opts.filename;
},
append: function (key, value) {
if (typeof key === 'object') {
$.extend(this._formData, key);
} else {
this._formData[key] = value;
}
},
setRequestHeader: function (key, value) {
if (typeof key === 'object') {
$.extend(this._headers, key);
} else {
this._headers[key] = value;
}
},
send: function (method) {
this.exec('send', method);
this._timeout();
},
abort: function () {
clearTimeout(this._timer);
return this.exec('abort');
},
destroy: function () {
this.trigger('destroy');
this.off();
this.exec('destroy');
this.disconnectRuntime();
},
getResponse: function () {
return this.exec('getResponse');
},
getResponseAsJson: function () {
return this.exec('getResponseAsJson');
},
getStatus: function () {
return this.exec('getStatus');
},
_timeout: function () {
var me = this,
duration = me.options.timeout;
if (!duration) {
return;
}
clearTimeout(me._timer);
me._timer = setTimeout(function () {
me.abort();
me.trigger('error', 'timeout');
}, duration);
}
});
Mediator.installTo(Transport.prototype);
return Transport;
});
define('widgets/upload', ['base', 'uploader', 'file', 'lib/transport', 'widgets/widget'], function (Base, Uploader, WUFile, Transport) {
var $ = Base.$,
isPromise = Base.isPromise,
Status = WUFile.Status;
$.extend(Uploader.options, {
prepareNextFile: false,
chunked: false,
chunkSize: * * ,
chunkRetry: ,
threads: ,
formData: {}
}); function CuteFile(file, chunkSize) {
var pending = [],
blob = file.source,
total = blob.size,
chunks = chunkSize ? Math.ceil(total / chunkSize) : ,
start = ,
index = ,
len, api;
api = {
file: file,
has: function () {
return !!pending.length;
},
shift: function () {
return pending.shift();
},
unshift: function (block) {
pending.unshift(block);
}
};
while (index < chunks) {
len = Math.min(chunkSize, total - start);
pending.push({
file: file,
start: start,
end: chunkSize ? (start + len) : total,
total: total,
chunks: chunks,
chunk: index++,
cuted: api
});
start += len;
}
file.blocks = pending.concat();
file.remaning = pending.length;
return api;
}
Uploader.register({
name: 'upload',
init: function () {
var owner = this.owner,
me = this;
this.runing = false;
this.progress = false;
owner.on('startUpload', function () {
me.progress = true;
}).on('uploadFinished', function () {
me.progress = false;
});
this.pool = [];
this.stack = [];
this.pending = [];
this.remaning = ;
this.__tick = Base.bindFn(this._tick, this);
owner.on('uploadComplete', function (file) {
file.blocks && $.each(file.blocks, function (_, v) {
v.transport && (v.transport.abort(), v.transport.destroy());
delete v.transport;
});
delete file.blocks;
delete file.remaning;
});
},
reset: function () {
this.request('stop-upload', true);
this.runing = false;
this.pool = [];
this.stack = [];
this.pending = [];
this.remaning = ;
this._trigged = false;
this._promise = null;
},
startUpload: function (file) {
var me = this;
$.each(me.request('get-files', Status.INVALID), function () {
me.request('remove-file', this);
});
if (file) {
file = file.id ? file : me.request('get-file', file);
if (file.getStatus() === Status.INTERRUPT) {
$.each(me.pool, function (_, v) {
if (v.file !== file) {
return;
}
v.transport && v.transport.send();
});
file.setStatus(Status.QUEUED);
} else if (file.getStatus() === Status.PROGRESS) {
return;
} else {
file.setStatus(Status.QUEUED);
}
} else {
$.each(me.request('get-files', [Status.INITED]), function () {
this.setStatus(Status.QUEUED);
});
}
if (me.runing) {
return;
}
me.runing = true;
var files = [];
$.each(me.pool, function (_, v) {
var file = v.file;
if (file.getStatus() === Status.INTERRUPT) {
files.push(file);
me._trigged = false;
v.transport && v.transport.send();
}
});
var file;
while ((file = files.shift())) {
file.setStatus(Status.PROGRESS);
}
file || $.each(me.request('get-files', Status.INTERRUPT), function () {
this.setStatus(Status.PROGRESS);
});
me._trigged = false;
Base.nextTick(me.__tick);
me.owner.trigger('startUpload');
},
stopUpload: function (file, interrupt) {
var me = this;
if (file === true) {
interrupt = file;
file = null;
}
if (me.runing === false) {
return;
}
if (file) {
file = file.id ? file : me.request('get-file', file);
if (file.getStatus() !== Status.PROGRESS && file.getStatus() !== Status.QUEUED) {
return;
}
file.setStatus(Status.INTERRUPT);
$.each(me.pool, function (_, v) {
if (v.file !== file) {
return;
}
v.transport && v.transport.abort();
me._putback(v);
me._popBlock(v);
});
return Base.nextTick(me.__tick);
}
me.runing = false;
if (this._promise && this._promise.file) {
this._promise.file.setStatus(Status.INTERRUPT);
}
interrupt && $.each(me.pool, function (_, v) {
v.transport && v.transport.abort();
v.file.setStatus(Status.INTERRUPT);
});
me.owner.trigger('stopUpload');
},
cancelFile: function (file) {
file = file.id ? file : this.request('get-file', file);
file.blocks && $.each(file.blocks, function (_, v) {
var _tr = v.transport;
if (_tr) {
_tr.abort();
_tr.destroy();
delete v.transport;
}
});
file.setStatus(Status.CANCELLED);
this.owner.trigger('fileDequeued', file);
},
isInProgress: function () {
return !!this.progress;
},
_getStats: function () {
return this.request('get-stats');
},
skipFile: function (file, status) {
file = file.id ? file : this.request('get-file', file);
file.setStatus(status || Status.COMPLETE);
file.skipped = true;
file.blocks && $.each(file.blocks, function (_, v) {
var _tr = v.transport;
if (_tr) {
_tr.abort();
_tr.destroy();
delete v.transport;
}
});
this.owner.trigger('uploadSkip', file);
},
_tick: function () {
var me = this,
opts = me.options,
fn, val;
if (me._promise) {
return me._promise.always(me.__tick);
}
if (me.pool.length < opts.threads && (val = me._nextBlock())) {
me._trigged = false;
fn = function (val) {
me._promise = null;
val && val.file && me._startSend(val);
Base.nextTick(me.__tick);
};
me._promise = isPromise(val) ? val.always(fn) : fn(val);
} else if (!me.remaning && !me._getStats().numOfQueue && !me._getStats().numofInterrupt) {
me.runing = false;
me._trigged || Base.nextTick(function () {
me.owner.trigger('uploadFinished');
});
me._trigged = true;
}
},
_putback: function (block) {
var idx;
block.cuted.unshift(block);
idx = this.stack.indexOf(block.cuted);
if (!~idx) {
this.stack.unshift(block.cuted);
}
},
_getStack: function () {
var i = ,
act;
while ((act = this.stack[i++])) {
if (act.has() && act.file.getStatus() === Status.PROGRESS) {
return act;
} else if (!act.has() || act.file.getStatus() !== Status.PROGRESS && act.file.getStatus() !== Status.INTERRUPT) {
this.stack.splice(--i, );
}
}
return null;
},
_nextBlock: function () {
var me = this,
opts = me.options,
act, next, done, preparing;
if ((act = this._getStack())) {
if (opts.prepareNextFile && !me.pending.length) {
me._prepareNextFile();
}
return act.shift();
} else if (me.runing) {
if (!me.pending.length && me._getStats().numOfQueue) {
me._prepareNextFile();
}
next = me.pending.shift();
done = function (file) {
if (!file) {
return null;
}
act = CuteFile(file, opts.chunked ? opts.chunkSize : );
me.stack.push(act);
return act.shift();
};
if (isPromise(next)) {
preparing = next.file;
next = next[next.pipe ? 'pipe' : 'then'](done);
next.file = preparing;
return next;
}
return done(next);
}
},
_prepareNextFile: function () {
var me = this,
file = me.request('fetch-file'),
pending = me.pending,
promise;
if (file) {
promise = me.request('before-send-file', file, function () {
if (file.getStatus() === Status.PROGRESS || file.getStatus() === Status.INTERRUPT) {
return file;
}
return me._finishFile(file);
});
me.owner.trigger('uploadStart', file);
file.setStatus(Status.PROGRESS);
promise.file = file;
promise.done(function () {
var idx = $.inArray(promise, pending);
~idx && pending.splice(idx, , file);
});
promise.fail(function (reason) {
file.setStatus(Status.ERROR, reason);
me.owner.trigger('uploadError', file, reason);
me.owner.trigger('uploadComplete', file);
});
pending.push(promise);
}
},
_popBlock: function (block) {
var idx = $.inArray(block, this.pool);
this.pool.splice(idx, );
block.file.remaning--;
this.remaning--;
},
_startSend: function (block) {
var me = this,
file = block.file,
promise;
if (file.getStatus() !== Status.PROGRESS) {
if (file.getStatus() === Status.INTERRUPT) {
me._putback(block);
}
return;
}
me.pool.push(block);
me.remaning++;
block.blob = block.chunks === ? file.source : file.source.slice(block.start, block.end);
promise = me.request('before-send', block, function () {
if (file.getStatus() === Status.PROGRESS) {
me._doSend(block);
} else {
me._popBlock(block);
Base.nextTick(me.__tick);
}
});
promise.fail(function () {
if (file.remaning === ) {
me._finishFile(file).always(function () {
block.percentage = ;
me._popBlock(block);
me.owner.trigger('uploadComplete', file);
Base.nextTick(me.__tick);
});
} else {
block.percentage = ;
me.updateFileProgress(file);
me._popBlock(block);
Base.nextTick(me.__tick);
}
});
},
_doSend: function (block) {
var me = this,
owner = me.owner,
opts = me.options,
file = block.file,
tr = new Transport(opts),
data = $.extend({}, opts.formData),
headers = $.extend({}, opts.headers),
requestAccept, ret;
block.transport = tr;
tr.on('destroy', function () {
delete block.transport;
me._popBlock(block);
Base.nextTick(me.__tick);
});
tr.on('progress', function (percentage) {
block.percentage = percentage;
me.updateFileProgress(file);
});
requestAccept = function (reject) {
var fn;
ret = tr.getResponseAsJson() || {};
ret._raw = tr.getResponse();
fn = function (value) {
reject = value;
};
if (!owner.trigger('uploadAccept', block, ret, fn)) {
reject = reject || 'server';
}
return reject;
};
tr.on('error', function (type, flag) {
block.retried = block.retried || ;
if (block.chunks > && ~'http,abort'.indexOf(type) && block.retried < opts.chunkRetry) {
block.retried++;
tr.send();
} else {
if (!flag && type === 'server') {
type = requestAccept(type);
}
file.setStatus(Status.ERROR, type);
owner.trigger('uploadError', file, type);
owner.trigger('uploadComplete', file);
}
});
tr.on('load', function () {
var reason;
if ((reason = requestAccept())) {
tr.trigger('error', reason, true);
return;
}
if (file.remaning === ) {
me._finishFile(file, ret);
} else {
tr.destroy();
}
});
data = $.extend(data, {
id: file.id,
name: file.name,
type: file.type,
lastModifiedDate: file.lastModifiedDate,
size: file.size
});
block.chunks > && $.extend(data, {
chunks: block.chunks,
chunk: block.chunk
});
owner.trigger('uploadBeforeSend', block, data, headers);
tr.appendBlob(opts.fileVal, block.blob, file.name);
tr.append(data);
tr.setRequestHeader(headers);
tr.send();
},
_finishFile: function (file, ret, hds) {
var owner = this.owner;
return owner.request('after-send-file', arguments, function () {
file.setStatus(Status.COMPLETE);
owner.trigger('uploadSuccess', file, ret, hds);
}).fail(function (reason) {
if (file.getStatus() === Status.PROGRESS) {
file.setStatus(Status.ERROR, reason);
}
owner.trigger('uploadError', file, reason);
}).always(function () {
owner.trigger('uploadComplete', file);
});
},
updateFileProgress: function (file) {
var totalPercent = ,
uploaded = ;
if (!file.blocks) {
return;
}
$.each(file.blocks, function (_, v) {
uploaded += (v.percentage || ) * (v.end - v.start);
});
totalPercent = uploaded / file.size;
this.owner.trigger('uploadProgress', file, totalPercent || );
}
});
});
define('widgets/log', ['base', 'uploader', 'widgets/widget'], function (Base, Uploader) {
var $ = Base.$,
logUrl = ' http://static.tieba.baidu.com/tb/pms/img/st.gif??',
product = (location.hostname || location.host || 'protected').toLowerCase(),
enable = product && /baidu/i.exec(product),
base;
if (!enable) {
return;
}
base = {
dv: ,
master: 'webuploader',
online: /test/.exec(product) ? : ,
module: '',
product: product,
type:
}; function send(data) {
var obj = $.extend({}, base, data),
url = logUrl.replace(/^(.*)\?/, '$1' + $.param(obj)),
image = new Image();
image.src = url;
}
return Uploader.register({
name: 'log',
init: function () {
var owner = this.owner,
count = ,
size = ;
owner.on('error', function (code) {
send({
type: ,
c_error_code: code
});
}).on('uploadError', function (file, reason) {
send({
type: ,
c_error_code: 'UPLOAD_ERROR',
c_reason: '' + reason
});
}).on('uploadComplete', function (file) {
count++;
size += file.size;
}).on('uploadFinished', function () {
send({
c_count: count,
c_size: size
});
count = size = ;
});
send({
c_usage:
});
}
});
});
define('runtime/compbase', [], function () {
function CompBase(owner, runtime) {
this.owner = owner;
this.options = owner.options;
this.getRuntime = function () {
return runtime;
};
this.getRuid = function () {
return runtime.uid;
};
this.trigger = function () {
return owner.trigger.apply(owner, arguments);
};
}
return CompBase;
});
define('runtime/html5/runtime', ['base', 'runtime/runtime', 'runtime/compbase'], function (Base, Runtime, CompBase) {
var type = 'html5',
components = {}; function Html5Runtime() {
var pool = {},
me = this,
destroy = this.destroy;
Runtime.apply(me, arguments);
me.type = type;
me.exec = function (comp, fn) {
var client = this,
uid = client.uid,
args = Base.slice(arguments, ),
instance;
if (components[comp]) {
instance = pool[uid] = pool[uid] || new components[comp](client, me);
if (instance[fn]) {
return instance[fn].apply(instance, args);
}
}
};
me.destroy = function () {
return destroy && destroy.apply(this, arguments);
};
}
Base.inherits(Runtime, {
constructor: Html5Runtime,
init: function () {
var me = this;
setTimeout(function () {
me.trigger('ready');
}, );
}
});
Html5Runtime.register = function (name, component) {
var klass = components[name] = Base.inherits(CompBase, component);
return klass;
};
if (window.Blob && window.FileReader && window.DataView) {
Runtime.addRuntime(type, Html5Runtime);
}
return Html5Runtime;
});
define('runtime/html5/blob', ['runtime/html5/runtime', 'lib/blob'], function (Html5Runtime, Blob) {
return Html5Runtime.register('Blob', {
slice: function (start, end) {
var blob = this.owner.source,
slice = blob.slice || blob.webkitSlice || blob.mozSlice;
blob = slice.call(blob, start, end);
return new Blob(this.getRuid(), blob);
}
});
});
define('runtime/html5/filepicker', ['base', 'runtime/html5/runtime'], function (Base, Html5Runtime) {
var $ = Base.$;
return Html5Runtime.register('FilePicker', {
init: function () {
var container = this.getRuntime().getContainer(),
me = this,
owner = me.owner,
opts = me.options,
label = this.label = $(document.createElement('label')),
input = this.input = $(document.createElement('input')),
arr, i, len, mouseHandler;
input.attr('type', 'file');
input.attr('name', opts.name);
input.addClass('webuploader-element-invisible');
label.on('click', function () {
input.trigger('click');
});
label.css({
opacity: ,
width: '100%',
height: '100%',
display: 'block',
cursor: 'pointer',
background: '#ffffff'
});
if (opts.multiple) {
input.attr('multiple', 'multiple');
}
if (opts.accept && opts.accept.length > ) {
arr = [];
for (i = , len = opts.accept.length; i < len; i++) {
arr.push(opts.accept[i].mimeTypes);
}
input.attr('accept', arr.join(','));
}
container.append(input);
container.append(label);
mouseHandler = function (e) {
owner.trigger(e.type);
};
input.on('change', function (e) {
var fn = arguments.callee,
clone;
me.files = e.target.files;
clone = this.cloneNode(true);
clone.value = null;
this.parentNode.replaceChild(clone, this);
input.off();
input = $(clone).on('change', fn).on('mouseenter mouseleave', mouseHandler);
owner.trigger('change');
});
label.on('mouseenter mouseleave', mouseHandler);
},
getFiles: function () {
return this.files;
},
destroy: function () {
this.input.off();
this.label.off();
}
});
});
define('runtime/html5/util', ['base'], function (Base) {
var urlAPI = window.createObjectURL && window || window.URL && URL.revokeObjectURL && URL || window.webkitURL,
createObjectURL = Base.noop,
revokeObjectURL = createObjectURL;
if (urlAPI) {
createObjectURL = function () {
return urlAPI.createObjectURL.apply(urlAPI, arguments);
};
revokeObjectURL = function () {
return urlAPI.revokeObjectURL.apply(urlAPI, arguments);
};
}
return {
createObjectURL: createObjectURL,
revokeObjectURL: revokeObjectURL,
dataURL2Blob: function (dataURI) {
var byteStr, intArray, ab, i, mimetype, parts;
parts = dataURI.split(',');
if (~parts[].indexOf('base64')) {
byteStr = atob(parts[]);
} else {
byteStr = decodeURIComponent(parts[]);
}
ab = new ArrayBuffer(byteStr.length);
intArray = new Uint8Array(ab);
for (i = ; i < byteStr.length; i++) {
intArray[i] = byteStr.charCodeAt(i);
}
mimetype = parts[].split(':')[].split(';')[];
return this.arrayBufferToBlob(ab, mimetype);
},
dataURL2ArrayBuffer: function (dataURI) {
var byteStr, intArray, i, parts;
parts = dataURI.split(',');
if (~parts[].indexOf('base64')) {
byteStr = atob(parts[]);
} else {
byteStr = decodeURIComponent(parts[]);
}
intArray = new Uint8Array(byteStr.length);
for (i = ; i < byteStr.length; i++) {
intArray[i] = byteStr.charCodeAt(i);
}
return intArray.buffer;
},
arrayBufferToBlob: function (buffer, type) {
var builder = window.BlobBuilder || window.WebKitBlobBuilder,
bb;
if (builder) {
bb = new builder();
bb.append(buffer);
return bb.getBlob(type);
}
return new Blob([buffer], type ? {
type: type
} : {});
},
canvasToDataUrl: function (canvas, type, quality) {
return canvas.toDataURL(type, quality / );
},
parseMeta: function (blob, callback) {
callback(false, {});
},
updateImageHead: function (data) {
return data;
}
};
});
define('runtime/html5/imagemeta', ['runtime/html5/util'], function (Util) {
var api;
api = {
parsers: {
0xffe1: []
},
maxMetaDataSize: ,
parse: function (blob, cb) {
var me = this,
fr = new FileReader();
fr.onload = function () {
cb(false, me._parse(this.result));
fr = fr.onload = fr.onerror = null;
};
fr.onerror = function (e) {
cb(e.message);
fr = fr.onload = fr.onerror = null;
};
blob = blob.slice(, me.maxMetaDataSize);
fr.readAsArrayBuffer(blob.getSource());
},
_parse: function (buffer, noParse) {
if (buffer.byteLength < ) {
return;
}
var dataview = new DataView(buffer),
offset = ,
maxOffset = dataview.byteLength - ,
headLength = offset,
ret = {},
markerBytes, markerLength, parsers, i;
if (dataview.getUint16() === 0xffd8) {
while (offset < maxOffset) {
markerBytes = dataview.getUint16(offset);
if (markerBytes >= 0xffe0 && markerBytes <= 0xffef || markerBytes === 0xfffe) {
markerLength = dataview.getUint16(offset + ) + ;
if (offset + markerLength > dataview.byteLength) {
break;
}
parsers = api.parsers[markerBytes];
if (!noParse && parsers) {
for (i = ; i < parsers.length; i += ) {
parsers[i].call(api, dataview, offset, markerLength, ret);
}
}
offset += markerLength;
headLength = offset;
} else {
break;
}
}
if (headLength > ) {
if (buffer.slice) {
ret.imageHead = buffer.slice(, headLength);
} else {
ret.imageHead = new Uint8Array(buffer).subarray(, headLength);
}
}
}
return ret;
},
updateImageHead: function (buffer, head) {
var data = this._parse(buffer, true),
buf1, buf2, bodyoffset;
bodyoffset = ;
if (data.imageHead) {
bodyoffset = + data.imageHead.byteLength;
}
if (buffer.slice) {
buf2 = buffer.slice(bodyoffset);
} else {
buf2 = new Uint8Array(buffer).subarray(bodyoffset);
}
buf1 = new Uint8Array(head.byteLength + + buf2.byteLength);
buf1[] = 0xFF;
buf1[] = 0xD8;
buf1.set(new Uint8Array(head), );
buf1.set(new Uint8Array(buf2), head.byteLength + );
return buf1.buffer;
}
};
Util.parseMeta = function () {
return api.parse.apply(api, arguments);
};
Util.updateImageHead = function () {
return api.updateImageHead.apply(api, arguments);
};
return api;
});
define('runtime/html5/imagemeta/exif', ['base', 'runtime/html5/imagemeta'], function (Base, ImageMeta) {
var EXIF = {};
EXIF.ExifMap = function () {
return this;
};
EXIF.ExifMap.prototype.map = {
'Orientation': 0x0112
};
EXIF.ExifMap.prototype.get = function (id) {
return this[id] || this[this.map[id]];
};
EXIF.exifTagTypes = {
: {
getValue: function (dataView, dataOffset) {
return dataView.getUint8(dataOffset);
},
size:
},
: {
getValue: function (dataView, dataOffset) {
return String.fromCharCode(dataView.getUint8(dataOffset));
},
size: ,
ascii: true
},
: {
getValue: function (dataView, dataOffset, littleEndian) {
return dataView.getUint16(dataOffset, littleEndian);
},
size:
},
: {
getValue: function (dataView, dataOffset, littleEndian) {
return dataView.getUint32(dataOffset, littleEndian);
},
size:
},
: {
getValue: function (dataView, dataOffset, littleEndian) {
return dataView.getUint32(dataOffset, littleEndian) / dataView.getUint32(dataOffset + , littleEndian);
},
size:
},
: {
getValue: function (dataView, dataOffset, littleEndian) {
return dataView.getInt32(dataOffset, littleEndian);
},
size:
},
: {
getValue: function (dataView, dataOffset, littleEndian) {
return dataView.getInt32(dataOffset, littleEndian) / dataView.getInt32(dataOffset + , littleEndian);
},
size:
}
};
EXIF.exifTagTypes[] = EXIF.exifTagTypes[];
EXIF.getExifValue = function (dataView, tiffOffset, offset, type, length, littleEndian) {
var tagType = EXIF.exifTagTypes[type],
tagSize, dataOffset, values, i, str, c;
if (!tagType) {
Base.log('Invalid Exif data: Invalid tag type.');
return;
}
tagSize = tagType.size * length;
dataOffset = tagSize > ? tiffOffset + dataView.getUint32(offset + , littleEndian) : (offset + );
if (dataOffset + tagSize > dataView.byteLength) {
Base.log('Invalid Exif data: Invalid data offset.');
return;
}
if (length === ) {
return tagType.getValue(dataView, dataOffset, littleEndian);
}
values = [];
for (i = ; i < length; i += ) {
values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);
}
if (tagType.ascii) {
str = '';
for (i = ; i < values.length; i += ) {
c = values[i];
if (c === '\u0000') {
break;
}
str += c;
}
return str;
}
return values;
};
EXIF.parseExifTag = function (dataView, tiffOffset, offset, littleEndian, data) {
var tag = dataView.getUint16(offset, littleEndian);
data.exif[tag] = EXIF.getExifValue(dataView, tiffOffset, offset, dataView.getUint16(offset + , littleEndian), dataView.getUint32(offset + , littleEndian), littleEndian);
};
EXIF.parseExifTags = function (dataView, tiffOffset, dirOffset, littleEndian, data) {
var tagsNumber, dirEndOffset, i;
if (dirOffset + > dataView.byteLength) {
Base.log('Invalid Exif data: Invalid directory offset.');
return;
}
tagsNumber = dataView.getUint16(dirOffset, littleEndian);
dirEndOffset = dirOffset + + * tagsNumber;
if (dirEndOffset + > dataView.byteLength) {
Base.log('Invalid Exif data: Invalid directory size.');
return;
}
for (i = ; i < tagsNumber; i += ) {
this.parseExifTag(dataView, tiffOffset, dirOffset + + * i, littleEndian, data);
}
return dataView.getUint32(dirEndOffset, littleEndian);
};
EXIF.parseExifData = function (dataView, offset, length, data) {
var tiffOffset = offset + ,
littleEndian, dirOffset;
if (dataView.getUint32(offset + ) !== 0x45786966) {
return;
}
if (tiffOffset + > dataView.byteLength) {
Base.log('Invalid Exif data: Invalid segment size.');
return;
}
if (dataView.getUint16(offset + ) !== 0x0000) {
Base.log('Invalid Exif data: Missing byte alignment offset.');
return;
}
switch (dataView.getUint16(tiffOffset)) {
case 0x4949:
littleEndian = true;
break;
case 0x4D4D:
littleEndian = false;
break;
default:
Base.log('Invalid Exif data: Invalid byte alignment marker.');
return;
}
if (dataView.getUint16(tiffOffset + , littleEndian) !== 0x002A) {
Base.log('Invalid Exif data: Missing TIFF marker.');
return;
}
dirOffset = dataView.getUint32(tiffOffset + , littleEndian);
data.exif = new EXIF.ExifMap();
dirOffset = EXIF.parseExifTags(dataView, tiffOffset, tiffOffset + dirOffset, littleEndian, data);
};
ImageMeta.parsers[0xffe1].push(EXIF.parseExifData);
return EXIF;
});
define('runtime/html5/image', ['base', 'runtime/html5/runtime', 'runtime/html5/util'], function (Base, Html5Runtime, Util) {
var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
return Html5Runtime.register('Image', {
modified: false,
init: function () {
var me = this,
img = new Image();
img.onload = function () {
me._info = {
type: me.type,
width: this.width,
height: this.height
};
if (!me._metas && 'image/jpeg' === me.type) {
Util.parseMeta(me._blob, function (error, ret) {
me._metas = ret;
me.owner.trigger('load');
});
} else {
me.owner.trigger('load');
}
};
img.onerror = function () {
me.owner.trigger('error');
};
me._img = img;
},
loadFromBlob: function (blob) {
var me = this,
img = me._img;
me._blob = blob;
me.type = blob.type;
img.src = Util.createObjectURL(blob.getSource());
me.owner.once('load', function () {
Util.revokeObjectURL(img.src);
});
},
resize: function (width, height) {
var canvas = this._canvas || (this._canvas = document.createElement('canvas'));
this._resize(this._img, canvas, width, height);
this._blob = null;
this.modified = true;
this.owner.trigger('complete', 'resize');
},
crop: function (x, y, w, h, s) {
var cvs = this._canvas || (this._canvas = document.createElement('canvas')),
opts = this.options,
img = this._img,
iw = img.naturalWidth,
ih = img.naturalHeight,
orientation = this.getOrientation();
s = s || ;
cvs.width = w;
cvs.height = h;
opts.preserveHeaders || this._rotate2Orientaion(cvs, orientation);
this._renderImageToCanvas(cvs, img, -x, -y, iw * s, ih * s);
this._blob = null;
this.modified = true;
this.owner.trigger('complete', 'crop');
},
getAsBlob: function (type) {
var blob = this._blob,
opts = this.options,
canvas;
type = type || this.type;
if (this.modified || this.type !== type) {
canvas = this._canvas;
if (type === 'image/jpeg') {
blob = Util.canvasToDataUrl(canvas, type, opts.quality);
if (opts.preserveHeaders && this._metas && this._metas.imageHead) {
blob = Util.dataURL2ArrayBuffer(blob);
blob = Util.updateImageHead(blob, this._metas.imageHead);
blob = Util.arrayBufferToBlob(blob, type);
return blob;
}
} else {
blob = Util.canvasToDataUrl(canvas, type);
}
blob = Util.dataURL2Blob(blob);
}
return blob;
},
getAsDataUrl: function (type) {
var opts = this.options;
type = type || this.type;
if (type === 'image/jpeg') {
return Util.canvasToDataUrl(this._canvas, type, opts.quality);
} else {
return this._canvas.toDataURL(type);
}
},
getOrientation: function () {
return this._metas && this._metas.exif && this._metas.exif.get('Orientation') || ;
},
info: function (val) {
if (val) {
this._info = val;
return this;
}
return this._info;
},
meta: function (val) {
if (val) {
this._meta = val;
return this;
}
return this._meta;
},
destroy: function () {
var canvas = this._canvas;
this._img.onload = null;
if (canvas) {
canvas.getContext('2d').clearRect(, , canvas.width, canvas.height);
canvas.width = canvas.height = ;
this._canvas = null;
}
this._img.src = BLANK;
this._img = this._blob = null;
},
_resize: function (img, cvs, width, height) {
var opts = this.options,
naturalWidth = img.width,
naturalHeight = img.height,
orientation = this.getOrientation(),
scale, w, h, x, y;
if (~[, , , ].indexOf(orientation)) {
width ^= height;
height ^= width;
width ^= height;
}
scale = Math[opts.crop ? 'max' : 'min'](width / naturalWidth, height / naturalHeight);
opts.allowMagnify || (scale = Math.min(, scale));
w = naturalWidth * scale;
h = naturalHeight * scale;
if (opts.crop) {
cvs.width = width;
cvs.height = height;
} else {
cvs.width = w;
cvs.height = h;
}
x = (cvs.width - w) / ;
y = (cvs.height - h) / ;
opts.preserveHeaders || this._rotate2Orientaion(cvs, orientation);
this._renderImageToCanvas(cvs, img, x, y, w, h);
},
_rotate2Orientaion: function (canvas, orientation) {
var width = canvas.width,
height = canvas.height,
ctx = canvas.getContext('2d');
switch (orientation) {
case :
case :
case :
case :
canvas.width = height;
canvas.height = width;
break;
}
switch (orientation) {
case :
ctx.translate(width, );
ctx.scale(-, );
break;
case :
ctx.translate(width, height);
ctx.rotate(Math.PI);
break;
case :
ctx.translate(, height);
ctx.scale(, -);
break;
case :
ctx.rotate(0.5 * Math.PI);
ctx.scale(, -);
break;
case :
ctx.rotate(0.5 * Math.PI);
ctx.translate(, -height);
break;
case :
ctx.rotate(0.5 * Math.PI);
ctx.translate(width, -height);
ctx.scale(-, );
break;
case :
ctx.rotate(-0.5 * Math.PI);
ctx.translate(-width, );
break;
}
},
_renderImageToCanvas: (function () {
if (!Base.os.ios) {
return function (canvas) {
var args = Base.slice(arguments, ),
ctx = canvas.getContext('2d');
ctx.drawImage.apply(ctx, args);
};
} function detectVerticalSquash(img, iw, ih) {
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
sy = ,
ey = ih,
py = ih,
data, alpha, ratio;
canvas.width = ;
canvas.height = ih;
ctx.drawImage(img, , );
data = ctx.getImageData(, , , ih).data;
while (py > sy) {
alpha = data[(py - ) * + ];
if (alpha === ) {
ey = py;
} else {
sy = py;
}
py = (ey + sy) >> ;
}
ratio = (py / ih);
return (ratio === ) ? : ratio;
}
if (Base.os.ios >= ) {
return function (canvas, img, x, y, w, h) {
var iw = img.naturalWidth,
ih = img.naturalHeight,
vertSquashRatio = detectVerticalSquash(img, iw, ih);
return canvas.getContext('2d').drawImage(img, , , iw * vertSquashRatio, ih * vertSquashRatio, x, y, w, h);
};
} function detectSubsampling(img) {
var iw = img.naturalWidth,
ih = img.naturalHeight,
canvas, ctx;
if (iw * ih > * ) {
canvas = document.createElement('canvas');
canvas.width = canvas.height = ;
ctx = canvas.getContext('2d');
ctx.drawImage(img, -iw + , );
return ctx.getImageData(, , , ).data[] === ;
} else {
return false;
}
}
return function (canvas, img, x, y, width, height) {
var iw = img.naturalWidth,
ih = img.naturalHeight,
ctx = canvas.getContext('2d'),
subsampled = detectSubsampling(img),
doSquash = this.type === 'image/jpeg',
d = ,
sy = ,
dy = ,
tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
if (subsampled) {
iw /= ;
ih /= ;
}
ctx.save();
tmpCanvas = document.createElement('canvas');
tmpCanvas.width = tmpCanvas.height = d;
tmpCtx = tmpCanvas.getContext('2d');
vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : ;
dw = Math.ceil(d * width / iw);
dh = Math.ceil(d * height / ih / vertSquashRatio);
while (sy < ih) {
sx = ;
dx = ;
while (sx < iw) {
tmpCtx.clearRect(, , d, d);
tmpCtx.drawImage(img, -sx, -sy);
ctx.drawImage(tmpCanvas, , , d, d, x + dx, y + dy, dw, dh);
sx += d;
dx += dw;
}
sy += d;
dy += dh;
}
ctx.restore();
tmpCanvas = tmpCtx = null;
};
})()
});
});
define('runtime/html5/jpegencoder', [], function (require, exports, module) {
function JPEGEncoder(quality) {
var self = this;
var fround = Math.round;
var ffloor = Math.floor;
var YTable = new Array();
var UVTable = new Array();
var fdtbl_Y = new Array();
var fdtbl_UV = new Array();
var YDC_HT;
var UVDC_HT;
var YAC_HT;
var UVAC_HT;
var bitcode = new Array();
var category = new Array();
var outputfDCTQuant = new Array();
var DU = new Array();
var byteout = [];
var bytenew = ;
var bytepos = ;
var YDU = new Array();
var UDU = new Array();
var VDU = new Array();
var clt = new Array();
var RGB_YUV_TABLE = new Array();
var currentQuality;
var ZigZag = [, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
var std_dc_luminance_nrcodes = [, , , , , , , , , , , , , , , , ];
var std_dc_luminance_values = [, , , , , , , , , , , ];
var std_ac_luminance_nrcodes = [, , , , , , , , , , , , , , , , 0x7d];
var std_ac_luminance_values = [0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa];
var std_dc_chrominance_nrcodes = [, , , , , , , , , , , , , , , , ];
var std_dc_chrominance_values = [, , , , , , , , , , , ];
var std_ac_chrominance_nrcodes = [, , , , , , , , , , , , , , , , 0x77];
var std_ac_chrominance_values = [0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa]; function initQuantTables(sf) {
var YQT = [, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
for (var i = ; i < ; i++) {
var t = ffloor((YQT[i] * sf + ) / );
if (t < ) {
t = ;
} else if (t > ) {
t = ;
}
YTable[ZigZag[i]] = t;
}
var UVQT = [, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
for (var j = ; j < ; j++) {
var u = ffloor((UVQT[j] * sf + ) / );
if (u < ) {
u = ;
} else if (u > ) {
u = ;
}
UVTable[ZigZag[j]] = u;
}
var aasf = [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, 0.275899379];
var k = ;
for (var row = ; row < ; row++) {
for (var col = ; col < ; col++) {
fdtbl_Y[k] = (1.0 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
k++;
}
}
} function computeHuffmanTbl(nrcodes, std_table) {
var codevalue = ;
var pos_in_table = ;
var HT = new Array();
for (var k = ; k <= ; k++) {
for (var j = ; j <= nrcodes[k]; j++) {
HT[std_table[pos_in_table]] = [];
HT[std_table[pos_in_table]][] = codevalue;
HT[std_table[pos_in_table]][] = k;
pos_in_table++;
codevalue++;
}
codevalue *= ;
}
return HT;
} function initHuffmanTbl() {
YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values);
UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values);
YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values);
UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values);
} function initCategoryNumber() {
var nrlower = ;
var nrupper = ;
for (var cat = ; cat <= ; cat++) {
for (var nr = nrlower; nr < nrupper; nr++) {
category[ + nr] = cat;
bitcode[ + nr] = [];
bitcode[ + nr][] = cat;
bitcode[ + nr][] = nr;
}
for (var nrneg = -(nrupper - ); nrneg <= -nrlower; nrneg++) {
category[ + nrneg] = cat;
bitcode[ + nrneg] = [];
bitcode[ + nrneg][] = cat;
bitcode[ + nrneg][] = nrupper - + nrneg;
}
nrlower <<= ;
nrupper <<= ;
}
} function initRGBYUVTable() {
for (var i = ; i < ; i++) {
RGB_YUV_TABLE[i] = * i;
RGB_YUV_TABLE[(i + ) >> ] = * i;
RGB_YUV_TABLE[(i + ) >> ] = * i + 0x8000;
RGB_YUV_TABLE[(i + ) >> ] = - * i;
RGB_YUV_TABLE[(i + ) >> ] = - * i;
RGB_YUV_TABLE[(i + ) >> ] = * i + 0x807FFF;
RGB_YUV_TABLE[(i + ) >> ] = - * i;
RGB_YUV_TABLE[(i + ) >> ] = - * i;
}
} function writeBits(bs) {
var value = bs[];
var posval = bs[] - ;
while (posval >= ) {
if (value & ( << posval)) {
bytenew |= ( << bytepos);
}
posval--;
bytepos--;
if (bytepos < ) {
if (bytenew == 0xFF) {
writeByte(0xFF);
writeByte();
} else {
writeByte(bytenew);
}
bytepos = ;
bytenew = ;
}
}
} function writeByte(value) {
byteout.push(clt[value]);
} function writeWord(value) {
writeByte((value >> ) & 0xFF);
writeByte((value) & 0xFF);
} function fDCTQuant(data, fdtbl) {
var d0, d1, d2, d3, d4, d5, d6, d7;
var dataOff = ;
var i;
var I8 = ;
var I64 = ;
for (i = ; i < I8; ++i) {
d0 = data[dataOff];
d1 = data[dataOff + ];
d2 = data[dataOff + ];
d3 = data[dataOff + ];
d4 = data[dataOff + ];
d5 = data[dataOff + ];
d6 = data[dataOff + ];
d7 = data[dataOff + ];
var tmp0 = d0 + d7;
var tmp7 = d0 - d7;
var tmp1 = d1 + d6;
var tmp6 = d1 - d6;
var tmp2 = d2 + d5;
var tmp5 = d2 - d5;
var tmp3 = d3 + d4;
var tmp4 = d3 - d4;
var tmp10 = tmp0 + tmp3;
var tmp13 = tmp0 - tmp3;
var tmp11 = tmp1 + tmp2;
var tmp12 = tmp1 - tmp2;
data[dataOff] = tmp10 + tmp11;
data[dataOff + ] = tmp10 - tmp11;
var z1 = (tmp12 + tmp13) * 0.707106781;
data[dataOff + ] = tmp13 + z1;
data[dataOff + ] = tmp13 - z1;
tmp10 = tmp4 + tmp5;
tmp11 = tmp5 + tmp6;
tmp12 = tmp6 + tmp7;
var z5 = (tmp10 - tmp12) * 0.382683433;
var z2 = 0.541196100 * tmp10 + z5;
var z4 = 1.306562965 * tmp12 + z5;
var z3 = tmp11 * 0.707106781;
var z11 = tmp7 + z3;
var z13 = tmp7 - z3;
data[dataOff + ] = z13 + z2;
data[dataOff + ] = z13 - z2;
data[dataOff + ] = z11 + z4;
data[dataOff + ] = z11 - z4;
dataOff += ;
}
dataOff = ;
for (i = ; i < I8; ++i) {
d0 = data[dataOff];
d1 = data[dataOff + ];
d2 = data[dataOff + ];
d3 = data[dataOff + ];
d4 = data[dataOff + ];
d5 = data[dataOff + ];
d6 = data[dataOff + ];
d7 = data[dataOff + ];
var tmp0p2 = d0 + d7;
var tmp7p2 = d0 - d7;
var tmp1p2 = d1 + d6;
var tmp6p2 = d1 - d6;
var tmp2p2 = d2 + d5;
var tmp5p2 = d2 - d5;
var tmp3p2 = d3 + d4;
var tmp4p2 = d3 - d4;
var tmp10p2 = tmp0p2 + tmp3p2;
var tmp13p2 = tmp0p2 - tmp3p2;
var tmp11p2 = tmp1p2 + tmp2p2;
var tmp12p2 = tmp1p2 - tmp2p2;
data[dataOff] = tmp10p2 + tmp11p2;
data[dataOff + ] = tmp10p2 - tmp11p2;
var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
data[dataOff + ] = tmp13p2 + z1p2;
data[dataOff + ] = tmp13p2 - z1p2;
tmp10p2 = tmp4p2 + tmp5p2;
tmp11p2 = tmp5p2 + tmp6p2;
tmp12p2 = tmp6p2 + tmp7p2;
var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
var z2p2 = 0.541196100 * tmp10p2 + z5p2;
var z4p2 = 1.306562965 * tmp12p2 + z5p2;
var z3p2 = tmp11p2 * 0.707106781;
var z11p2 = tmp7p2 + z3p2;
var z13p2 = tmp7p2 - z3p2;
data[dataOff + ] = z13p2 + z2p2;
data[dataOff + ] = z13p2 - z2p2;
data[dataOff + ] = z11p2 + z4p2;
data[dataOff + ] = z11p2 - z4p2;
dataOff++;
}
var fDCTQuant;
for (i = ; i < I64; ++i) {
fDCTQuant = data[i] * fdtbl[i];
outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5) | ) : ((fDCTQuant - 0.5) | );
}
return outputfDCTQuant;
} function writeAPP0() {
writeWord(0xFFE0);
writeWord();
writeByte(0x4A);
writeByte(0x46);
writeByte(0x49);
writeByte(0x46);
writeByte();
writeByte();
writeByte();
writeByte();
writeWord();
writeWord();
writeByte();
writeByte();
} function writeSOF0(width, height) {
writeWord(0xFFC0);
writeWord();
writeByte();
writeWord(height);
writeWord(width);
writeByte();
writeByte();
writeByte(0x11);
writeByte();
writeByte();
writeByte(0x11);
writeByte();
writeByte();
writeByte(0x11);
writeByte();
} function writeDQT() {
writeWord(0xFFDB);
writeWord();
writeByte();
for (var i = ; i < ; i++) {
writeByte(YTable[i]);
}
writeByte();
for (var j = ; j < ; j++) {
writeByte(UVTable[j]);
}
} function writeDHT() {
writeWord(0xFFC4);
writeWord(0x01A2);
writeByte();
for (var i = ; i < ; i++) {
writeByte(std_dc_luminance_nrcodes[i + ]);
}
for (var j = ; j <= ; j++) {
writeByte(std_dc_luminance_values[j]);
}
writeByte(0x10);
for (var k = ; k < ; k++) {
writeByte(std_ac_luminance_nrcodes[k + ]);
}
for (var l = ; l <= ; l++) {
writeByte(std_ac_luminance_values[l]);
}
writeByte();
for (var m = ; m < ; m++) {
writeByte(std_dc_chrominance_nrcodes[m + ]);
}
for (var n = ; n <= ; n++) {
writeByte(std_dc_chrominance_values[n]);
}
writeByte(0x11);
for (var o = ; o < ; o++) {
writeByte(std_ac_chrominance_nrcodes[o + ]);
}
for (var p = ; p <= ; p++) {
writeByte(std_ac_chrominance_values[p]);
}
} function writeSOS() {
writeWord(0xFFDA);
writeWord();
writeByte();
writeByte();
writeByte();
writeByte();
writeByte(0x11);
writeByte();
writeByte(0x11);
writeByte();
writeByte(0x3f);
writeByte();
} function processDU(CDU, fdtbl, DC, HTDC, HTAC) {
var EOB = HTAC[0x00];
var M16zeroes = HTAC[0xF0];
var pos;
var I16 = ;
var I63 = ;
var I64 = ;
var DU_DCT = fDCTQuant(CDU, fdtbl);
for (var j = ; j < I64; ++j) {
DU[ZigZag[j]] = DU_DCT[j];
}
var Diff = DU[] - DC;
DC = DU[];
if (Diff == ) {
writeBits(HTDC[]);
} else {
pos = + Diff;
writeBits(HTDC[category[pos]]);
writeBits(bitcode[pos]);
}
var end0pos = ;
for (;
(end0pos > ) && (DU[end0pos] == ); end0pos--) {};
if (end0pos == ) {
writeBits(EOB);
return DC;
}
var i = ;
var lng;
while (i <= end0pos) {
var startpos = i;
for (;
(DU[i] == ) && (i <= end0pos); ++i) {}
var nrzeroes = i - startpos;
if (nrzeroes >= I16) {
lng = nrzeroes >> ;
for (var nrmarker = ; nrmarker <= lng; ++nrmarker)
writeBits(M16zeroes);
nrzeroes = nrzeroes & 0xF;
}
pos = + DU[i];
writeBits(HTAC[(nrzeroes << ) + category[pos]]);
writeBits(bitcode[pos]);
i++;
}
if (end0pos != I63) {
writeBits(EOB);
}
return DC;
} function initCharLookupTable() {
var sfcc = String.fromCharCode;
for (var i = ; i < ; i++) {
clt[i] = sfcc(i);
}
}
this.encode = function (image, quality) {
if (quality) setQuality(quality);
byteout = new Array();
bytenew = ;
bytepos = ;
writeWord(0xFFD8);
writeAPP0();
writeDQT();
writeSOF0(image.width, image.height);
writeDHT();
writeSOS();
var DCY = ;
var DCU = ;
var DCV = ;
bytenew = ;
bytepos = ;
this.encode.displayName = "_encode_";
var imageData = image.data;
var width = image.width;
var height = image.height;
var quadWidth = width * ;
var tripleWidth = width * ;
var x, y = ;
var r, g, b;
var start, p, col, row, pos;
while (y < height) {
x = ;
while (x < quadWidth) {
start = quadWidth * y + x;
p = start;
col = -;
row = ;
for (pos = ; pos < ; pos++) {
row = pos >> ;
col = (pos & ) * ;
p = start + (row * quadWidth) + col;
if (y + row >= height) {
p -= (quadWidth * (y + + row - height));
}
if (x + col >= quadWidth) {
p -= ((x + col) - quadWidth + )
}
r = imageData[p++];
g = imageData[p++];
b = imageData[p++];
YDU[pos] = ((RGB_YUV_TABLE[r] + RGB_YUV_TABLE[(g + ) >> ] + RGB_YUV_TABLE[(b + ) >> ]) >> ) - ;
UDU[pos] = ((RGB_YUV_TABLE[(r + ) >> ] + RGB_YUV_TABLE[(g + ) >> ] + RGB_YUV_TABLE[(b + ) >> ]) >> ) - ;
VDU[pos] = ((RGB_YUV_TABLE[(r + ) >> ] + RGB_YUV_TABLE[(g + ) >> ] + RGB_YUV_TABLE[(b + ) >> ]) >> ) - ;
}
DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
x += ;
}
y += ;
}
if (bytepos >= ) {
var fillbits = [];
fillbits[] = bytepos + ;
fillbits[] = ( << (bytepos + )) - ;
writeBits(fillbits);
}
writeWord(0xFFD9);
var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
byteout = [];
return jpegDataUri
} function setQuality(quality) {
if (quality <= ) {
quality = ;
}
if (quality > ) {
quality = ;
}
if (currentQuality == quality) return
var sf = ;
if (quality < ) {
sf = Math.floor( / quality);
} else {
sf = Math.floor( - quality * );
}
initQuantTables(sf);
currentQuality = quality;
} function init() {
if (!quality) quality = ;
initCharLookupTable()
initHuffmanTbl();
initCategoryNumber();
initRGBYUVTable();
setQuality(quality);
}
init();
};
JPEGEncoder.encode = function (data, quality) {
var encoder = new JPEGEncoder(quality);
return encoder.encode(data);
}
return JPEGEncoder;
});
define('runtime/html5/androidpatch', ['runtime/html5/util', 'runtime/html5/jpegencoder', 'base'], function (Util, encoder, Base) {
var origin = Util.canvasToDataUrl,
supportJpeg;
Util.canvasToDataUrl = function (canvas, type, quality) {
var ctx, w, h, fragement, parts;
if (!Base.os.android) {
return origin.apply(null, arguments);
}
if (type === 'image/jpeg' && typeof supportJpeg === 'undefined') {
fragement = origin.apply(null, arguments);
parts = fragement.split(',');
if (~parts[].indexOf('base64')) {
fragement = atob(parts[]);
} else {
fragement = decodeURIComponent(parts[]);
}
fragement = fragement.substring(, );
supportJpeg = fragement.charCodeAt() === && fragement.charCodeAt() === ;
}
if (type === 'image/jpeg' && !supportJpeg) {
w = canvas.width;
h = canvas.height;
ctx = canvas.getContext('2d');
return encoder.encode(ctx.getImageData(, , w, h), quality);
}
return origin.apply(null, arguments);
};
});
define('runtime/html5/transport', ['base', 'runtime/html5/runtime'], function (Base, Html5Runtime) {
var noop = Base.noop,
$ = Base.$;
return Html5Runtime.register('Transport', {
init: function () {
this._status = ;
this._response = null;
},
send: function () {
var owner = this.owner,
opts = this.options,
xhr = this._initAjax(),
blob = owner._blob,
server = opts.server,
formData, binary, fr;
if (opts.sendAsBinary) {
server += (/\?/.test(server) ? '&' : '?') +
$.param(owner._formData);
binary = blob.getSource();
} else {
formData = new FormData();
$.each(owner._formData, function (k, v) {
formData.append(k, v);
});
formData.append(opts.fileVal, blob.getSource(), opts.filename || owner._formData.name || '');
}
if (opts.withCredentials && 'withCredentials' in xhr) {
xhr.open(opts.method, server, true);
xhr.withCredentials = true;
} else {
xhr.open(opts.method, server);
}
this._setRequestHeader(xhr, opts.headers);
if (binary) {
xhr.overrideMimeType && xhr.overrideMimeType('application/octet-stream');
if (Base.os.android) {
fr = new FileReader();
fr.onload = function () {
xhr.send(this.result);
fr = fr.onload = null;
};
fr.readAsArrayBuffer(binary);
} else {
xhr.send(binary);
}
} else {
xhr.send(formData);
}
},
getResponse: function () {
return this._response;
},
getResponseAsJson: function () {
return this._parseJson(this._response);
},
getStatus: function () {
return this._status;
},
abort: function () {
var xhr = this._xhr;
if (xhr) {
xhr.upload.onprogress = noop;
xhr.onreadystatechange = noop;
xhr.abort();
this._xhr = xhr = null;
}
},
destroy: function () {
this.abort();
},
_initAjax: function () {
var me = this,
xhr = new XMLHttpRequest(),
opts = this.options;
if (opts.withCredentials && !('withCredentials' in xhr) && typeof XDomainRequest !== 'undefined') {
xhr = new XDomainRequest();
}
xhr.upload.onprogress = function (e) {
var percentage = ;
if (e.lengthComputable) {
percentage = e.loaded / e.total;
}
return me.trigger('progress', percentage);
};
xhr.onreadystatechange = function () {
if (xhr.readyState !== ) {
return;
}
xhr.upload.onprogress = noop;
xhr.onreadystatechange = noop;
me._xhr = null;
me._status = xhr.status;
if (xhr.status >= && xhr.status < ) {
me._response = xhr.responseText;
return me.trigger('load');
} else if (xhr.status >= && xhr.status < ) {
me._response = xhr.responseText;
return me.trigger('error', 'server');
}
return me.trigger('error', me._status ? 'http' : 'abort');
};
me._xhr = xhr;
return xhr;
},
_setRequestHeader: function (xhr, headers) {
$.each(headers, function (key, val) {
xhr.setRequestHeader(key, val);
});
},
_parseJson: function (str) {
var json;
try {
json = JSON.parse(str);
} catch (ex) {
json = {};
}
return json;
}
});
});
define('webuploader', ['base', 'widgets/filepicker', 'widgets/image', 'widgets/queue', 'widgets/runtime', 'widgets/upload', 'widgets/log', 'runtime/html5/blob', 'runtime/html5/filepicker', 'runtime/html5/imagemeta/exif', 'runtime/html5/image', 'runtime/html5/androidpatch', 'runtime/html5/transport'], function (Base) {
return Base;
});
return require('webuploader');
});
$(function () {
var uploader = WebUploader.create({
auto: true,
swf: swffile,
server: "/index.php/Order/csv.html",
pick: '#filePicker',
accept: {
title: 'csv',
extensions: 'csv',
mimeTypes: 'csv/*'
}
});
uploader.on('fileQueued', function (file) {
var keyVal = $("#Addons_pic").val();
if (keyVal == undefined || keyVal == "" || keyVal == null) {} else {
$("#fileList div").remove();
};
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
if (!$percent.length) {
$percent = $('<p class="progress"><span></span></p>').appendTo($li).find('span');
}
$percent.css('width', percentage * + '%');
});
uploader.on('uploadSuccess', function (file, response) {
if (response['status'] == '') {
var data = response['data'];
document.getElementById("postscript").value = data;
$(".webuploader-pick").html('重新上传');
} else {
alert(response['info']);
$("#fileList div").remove();
};
});
uploader.on('uploadError', function (file) {
alert('上传失败');
});
uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').remove();
});
});

html

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!--IE优先使用chrome内核-->
<meta name="renderer" content="webkit">
<!--360优先使用chrome内核-->
<meta http-equiv="Cache-Control" content="no-siteapp">
<!-- 禁止手机百度转码 -->
<title>天下刷空包</title>
<meta name="Keywords" content="天下刷空包">
<meta name="Description" content="天下刷空包">
<link rel="stylesheet" type="text/css" href="/Public/css/lxindex.css"> <!--头部-->
<div class="topNav" style="position:relative; z-index:101;">
<div class="resize">
<div class="topNav_l">欢迎上号,请<a href="/index.php/User/uslogin.html">登录</a><em>|</em><a href="/index.php/User/reg.html">注册</a>
</div>
<div class="topNav_r" style="width:701px">
<ul>
<li style="margin-left: 10px;margin-top:2px">
<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=89783050&site=qq&menu=yes">
<img src="/Public/images/qq1.gif" width="" height="">
</a>
</li>
<li><a href="/index.php/User/Home.html">会员中心 </a>
</li>
<li><em style="color:#27bfe4; margin-right:8px; margin-left:8px">|</em><a href="/index.php/User/liuyan.html">提交工单</a><em style="color:#27bfe4; margin-right:8px; margin-left:8px">|</em>
</li>
<li><em style="color:#27bfe4; margin-right:8px; margin-left:8px">|</em><a href="/index.php/Cash/recharge.html">资金充值</a>
</li>
<li class="tg sp">
<div class="lnk-newuser-title"><span style="color:#ffcc00;" class="icon icon-giving"></span> 新手专区 <i></i>
<div class="newuser-panel">
<div class="newuser-title"><a href="javascript:video(0)" class="first video_obj">站长介绍</a><a href="javascript:video(0)" class="first video_obj1">新手教程</a><a href="javascript:video(0)" class="first video_obj2"> 推广教程</a>
</div>
</div>
</div>
</li>
<li><a class="lnk-item newuser-ticket" id="LnkNewUserTip" href="/index.php/Tg/index.html" title="" style="display: inline;"> 邀请好友有礼
<i></i></a>
</li>
</ul>
</div>
</div>
<div class="helper-wrap">
<div class="helper-box">
<div class="helper-grab">
<div class="box-switch">
<a href="javascript:;" title="关闭" class="closehhh"></a>
</div><span class="top-text">您可能遇到的问题?</span>
</div>
<div class="helper-transition">
<div class="box-list2" style="border-bottom: 1px solid #ddd">
<div class="list_con">
<div class="list-tit"><a href="/index.php/Help/help/id/1.html"><em style="color:#6f7473">新用户下单指引</em></a>
</div>
</div>
</div><em style="color:#000"><p style="line-height: 30px;width: 50%;float: left;padding-bottom: 5px">售前QQ:(*12小时) <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=89783050&site=qq&menu=yes"><img src="/Public/images/pa.jpg" align="absmiddle"></a></p><p style="line-height: 30px;width: 50%;float: right;padding-bottom: 5px">售后电话:(*12小时)</p></em>
</div>
</div>
</div>
<div class="kefu_img" style="position: fixed;_position: absolute; top: 430px;right: 1px;z-index: 10000;width: 38px;height: 128px;"><span class="kefu_head"></span><span class="kefu_cont"></span>
</div> </div>
<div class="index1_40" style="width:100%; height:62px; background:#00a2ca; z-index:100; position:relative;">
<div class="index1_41" style="overflow:visible">
<div class="index1_42">
<a href="/index.php" class="index1_43">
<img src="/Public/Uploads/admin/56176c8c34ca5.png" height="60px">
</a>
</div>
<ul id="menu">
<li><a href="/index.php" class="tit">首页</a>
</li>
<li><a href="/index.php/User/Home.html" title="管理中心" class="tit">管理中心</a>
</li>
<li><a href="/index.php/Order/kb.html" title="购买空包" class="tit">购买空包<img src="/Public/kindeditor/attached/image/20151119/20151119012125_88667.png" width="" style="margin-left:5px;" alt="购买空包"></a>
</li>
<li><a href="/index.php/Cash/recharge.html" title="在线充值" class="tit">在线充值</a>
</li>
<li><a href="/index.php/Tg/index.html" title="推广赚钱" class="tit">推广赚钱<img src="/Public/kindeditor/attached/image/20151119/20151119012218_56568.gif" width="" style="margin-left:5px;" alt="推广赚钱"></a>
</li>
<li><a href="/index.php/Article/index.html" title="资讯中心" class="tit">资讯中心</a>
</li>
</ul>
<div id="qun"><a class="tit">QQ:</a>
</div>
<br class="clr">
</div>
</div>
<style>
.btn_jc {
padding:3px 15px;
border:1px solid #00a1cc;
border-radius:4px;
color:#00a1cc;
margin:5px ;
}
.tag_select {
display:block;
height:24px;
line-height:24px;
background:url("/Public/images/xlico.gif") right center no-repeat;
border:1px solid #CFCFCF;
border-radius:5px;
padding:3px 48px 3px 8px;
color:#7D7D7D;
font-size:12px;
cursor:pointer
}
ul.tag_options {
position:absolute;
margin:;
list-style:none;
border:solid 1px #CFCFCF;
background:#fff;
overflow:hidden;
font-size:12px;
z-index:;
}
ul.tag_options li {
background:#fff;
display:block;
padding:0px 8px 0px 8px;
height:25px;
text-decoration:none;
line-height:30px;
color:#7D7D7D;
font-weight:normal;
font-size:12px;
cursor:pointer
}
ul.tag_options li.open_hover {
background:#00a2ca;
color:#;
color:#fff;
width:auto;
font-weight:normal;
font-size:12px
}
ul.tag_options li.open_selected {
background:#00a2ca;
color:#fff;
font-size:12px;
}
.kongbao_kuaidiInfos {
position:relative;
}
.moban {
float:right;
left:380px;
top:1px;
position:absolute;
z-index:;
}
.label_sele {
float:right;
padding-right:291px;
padding-bottom:2px;
}
.pCont {
width:300px;
float:right;
height:230px;
overflow:hidden;
background:url(/Public/images/p_cont.jpg) center top no-repeat;
}
.pCont .p_nr {
width:190px;
padding-top:56px;
padding-left:60px;
}
.pCont .p_nr p {
font-size:14px;
color:#;
line-height:26px;
}
.content_body {
width:1200px;
height:580px;
overflow:hidden;
margin: auto
}
.content_body .symbol_img {
float:left;
margin-top:65px;
margin-left:130px;
width:420px;
height:325px
}
.index1_8 {
width:260px;
overflow:hidden;
float:right;
margin-right:;
margin-top:65px;
margin-right:150px;
padding:20px;
border:1px solid #ddd
}
.index1_9 {
margin-top:10px;
display:block;
width:%;
line-height:28px;
font-family:微软雅黑
}
.index1_9 span {
color:#4d4d4d;
font-weight:
}
.index1_9 a {
float:right;
color:#00a2ca;
font-family:微软雅黑
}
.index1_8>input {
width:248px;
height:38px;
line-height:38px;
border-radius:3px;
color:#;
border:1px solid #ddd;
padding: 5px
}
.index1_8>input:hover {
border:1px solid #
}
.index1_10 {
width:260px;
height:35px;
line-height:35px;
font-family:微软雅黑;
background:#00a2ca;
border-radius:3px;
display:block;
text-align:center;
margin-top:18px;
color:#fff;
font-size:14px
}
.index1_10:hover {
color:#fff!important;
text-decoration:none!important;
background:#33b5d4
}
.content_body .index1_8 .title {
border-bottom:1px solid #ddd;
line-height:25px;
color:#4d4d4d;
font-size:12px;
margin-top:8px;
font-family:'宋体'
}
.content_body .index1_8 .agreement {
width:%;
line-height:25px;
margin-top:50px
}
.content_body .index1_8 .agreement input {
vertical-align:middle
}
.content_body .index1_8 .agreement a {
color:#00a2ca
}
</style> <div class="getpass lbox" id="get_pass" style="display: none">
<form name="validateForm" id="reg" action="/index.php/User/back_send.html" method="POST" style="padding-top:0px; padding-bottom:0px;">
<table width="100%">
<tbody><tr>
<td align="right" width="30%">安全提问:</td>
<td class="pl20">
<select name="mibao_name" id="mibao_name">
<option value="">请选择安全问题</option>
<option value="你父亲的姓名是?">你父亲的姓名是?</option>
<option value="你母亲的姓名是?">你母亲的姓名是?</option>
<option value="你的梦想是什么?">你的梦想是什么?</option>
</select>
</td>
</tr>
<tr>
<td align="right">提问答案:</td>
<td class="pl20">
<input type="text" name="mibao_daan" id="mibao_daan" class="account1_17">
</td>
</tr>
<tr>
<td align="right">账号邮箱:</td>
<td class="pl20">
<input type="text" name="mibao_email" id="mibao_email" class="account1_17">
</td>
</tr>
<tr>
<td class="pt10"></td>
<td class="pl20 pt10">
<input type="submit" onclick="return zhaohui_submit()" class="btn_jc" value="提交">
</td>
</tr>
</tbody></table>
<input type="hidden" name="id" value="">
</form>
</div>
<div class="content_body">
<a href="#" target="_blank" class="symbol_img">
<img src="/Public/kindeditor/attached/image/20151009/20151009020236_39179.png" width="420px" height="325px" original-title="">
</a>
<form action="/index.php/User/login" id="register_form" method="post">
<div class="index1_8">
<div class="title"><a href="/">天下刷空包首页</a>
</div>
<div class="index1_9"><span>登录名:</span>
</div>
<input id="username" name="username" type="text" style="color:#999999" placeholder="手机/邮箱/会员名">
<div class="index1_9"><span>登录密码:</span><a style="float:right; margin-right:10px;" href="javascript:void(0)" onclick="art.dialog({title:'找回密码',content:document.getElementById('get_pass'),lock:true})">忘记登录密码?</a>
</div>
<input type="password" id="password" name="password" placeholder="登录密码">
<div class="agreement" style="margin-top: 10px">
<input checked="" type="checkbox">我同意并已阅读 <a href="javascript:;">《天下刷空包服务协议》</a>
</div>
<input id="button_search" type="submit" value="" name="button_search">
<div class="index1_9"><a style="float:right; margin-right:10px;" href="/index.php/User/reg.html">免费注册</a>
</div>
</div>
</form>
</div>
<style type="text/css">
#newFooter {
margin-top:0px;
padding:35px ;
border-top:1px solid #ccc;
text-align:center
}
#newFooter p {
text-align:center;
color:#;
line-height:24px
}
#newFooter p a {
margin: 10px;
font-size:14px;
color:#
}
#newFooter p a:hover {
text-decoration:underline
}
#newFooter p .f_icon {
display:inline-block;
width:22px;
height:23px
}
#newFooter p .f_icon.f_icon1 {
background:url(/Public/images/footer_icon.gif) no-repeat
}
#newFooter p .f_icon.f_icon2 {
background:url(/Public/images/footer_icon.gif) -23px no-repeat
}
#newFooter .cop {
text-align:center;
color:#;
line-height:24px
}
.cbbfixed {
position:fixed;
right:1px;
transition:bottom ease .3s;
bottom:-85px;
z-index:;
cursor:pointer
}
.cbbfixed .cbbtn {
width:38px;
height:38px;
display:block;
background-color:#ff9c00
}
.cbbfixed .gotop {
transition:background-color ease .3s;
margin-top:1px
}
.cbbfixed .gotop .up-icon {
float:left;
margin:14px 9px;
width:23px;
height:12px;
background:url(/Public/images/side-icon02.png)
}
.cbbfixed .gotop:hover {
background-color:#00a3cc
}
</style>
<div id="newFooter">
<div class="resize">
<p>
</p><p class="link2">Copyright@ - 天下刷空包 版权所有 </p>
<p>
<img src="/Public/images/Nindex15.jpg" width="" height="">
<img src="/Public/images/Nindex16.jpg" width="" height="">
</p>
</div>
<div><i class="f_icon f_icon1"></i><i class="f_icon f_icon2"></i>
<p></p>
</div>
</div>

kb的更多相关文章

  1. KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思? (注:B和b的区别)

    B是指字节(Byte)1个字节有8个比特组成    b是指比特(bit)代表一个2进制位(值为0或1) 上过网的朋友应该会听说过网络带宽这个词,可是这个网络带宽的单位到底是什么,为什么有的人说Kbps ...

  2. 理论基础知识之————KB Kb Kbps 相关单位的区别和换算

    换算公式 8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB 容量是大写的  B 而传输的速度是小写的  b bps ...

  3. Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法

    (1) 系统+软件版本 CentOS 6.5 (Final), 64 位,内核initramfs-2.6.32-431.5.1.el6.x86_64, MATLAB Version: 8.1.0.60 ...

  4. Mbps、Kbps、bps、MB、KB

    1:运营商带宽衡量单位: Mbps:百万位每秒 kbps:千位每秒 bps:位每秒 b:bit,比特 1Mbps=1000kbps=1,000,000bps 这些单位通常用来表示每秒传输的二进制位 2 ...

  5. 字节b换算kb/mb/gb/tb/pb

    public static string HumanReadableFilesize(double size) { string[] units = new string[] { "B&qu ...

  6. 等比例压缩图片到指定的KB大小

    基本原理: 取原来的图片,长宽乘以比例,重新生成一张图片,获取这张图片的大小,如果还是超过预期大小,继续在此基础上乘以压缩比例,生成图片,直到达到预期 /** * @获取远程图片的体积大小 单位byt ...

  7. http://kb.cnblogs.com/zt/ef/

    http://kb.cnblogs.com/zt/ef/ http://blog.csdn.net/mackz/article/details/8605063 http://www.telerik.c ...

  8. iOS 文件大小转换成 KB、MB、GB 。。。

    -(NSString *) convertFileSize:(long long)size { ; ; ; if (size >= gb) { return [NSString stringWi ...

  9. android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位

    android 获取文件夹.文件的大小 以B.KB.MB.GB 为单位   public class FileSizeUtil { public static final int SIZETYPE_B ...

随机推荐

  1. 学习 Message(5): 关于 TApplicationEvents.OnMessage 的第二个参数 可以屏蔽 TWebBrowser右键菜单:

    http://www.cnblogs.com/del/archive/2008/10/25/1319318.html TApplicationEvents.OnMessage 的第二个参数 Handl ...

  2. JS验证金额

    <script type="text/javascript">        function ismoney(obj) {            check(obj) ...

  3. 通过反射将变量值转为变量名本身ZZ

      这是.NET反射的一个有趣小例子:  通过反射将变量值转为变量名本身. 当然要先添加命名空间:using System.Reflection; 示例代码如下: class Program { st ...

  4. Unity 状态转化机器

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /** 有限状 ...

  5. Java NIO之通道Channel

    channel与流的区别: 流基于字节,且读写为单向的. 通道基于快Buffer,可以异步读写.除了FileChannel之外都是双向的. channel的主要实现: FileChannel Data ...

  6. Leetcode ReorderList

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  7. ACM: 限时训练题解-Heavy Coins-枚举子集-暴力枚举

    Heavy Coins   Bahosain has a lot of coins in his pocket. These coins are really heavy, so he always ...

  8. ACM: Just a Hook 解题报告 -线段树

    E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

  9. [WP8.1UI控件编程]Windows Phone VirtualizingStackPanel、ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件

    11.2.2 VirtualizingStackPanel.ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件 VirtualizingStackPanel.ItemsSta ...

  10. 【POJ】3207 Ikki's Story IV - Panda's Trick

    http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.( ...