").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file
diff --git a/demo/js/jquery.min.map b/demo/js/jquery.min.map
deleted file mode 100644
index 3b19b1a7..00000000
--- a/demo/js/jquery.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"jquery-1.9.1.min.js","sources":["jquery-1.9.1.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","document","location","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","size","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","e","key","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","replace","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","documentElement","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","Math","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","optionsCache","createOptions","object","_","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","shift","self","disable","add","start","unique","has","index","empty","disabled","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","contexts","values","progressValues","notifyWith","progressContexts","resolveContexts","support","a","input","select","fragment","opt","eventName","isSupported","div","setAttribute","innerHTML","appendChild","style","cssText","getSetAttribute","className","leadingWhitespace","firstChild","tbody","htmlSerialize","getAttribute","hrefNormalized","opacity","cssFloat","checkOn","optSelected","selected","enctype","html5Clone","cloneNode","outerHTML","boxModel","compatMode","deleteExpando","noCloneEvent","inlineBlockNeedsLayout","shrinkWrapBlocks","reliableMarginRight","boxSizingReliable","pixelPosition","checked","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","lastChild","click","submit","change","focusin","attributes","expando","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","boxSizing","offsetWidth","doesNotIncludeMarginInBodyOffset","offsetTop","getComputedStyle","width","marginRight","zoom","removeChild","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","getByName","isNode","cache","pop","toJSON","internalRemoveData","isEmptyDataObject","cleanData","random","noData","embed","applet","hasData","removeData","_data","_removeData","attrs","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","cur","unshift","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","elements","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","rboolean","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","isBool","classNames","hasClass","val","valHooks","set","option","specified","selectedIndex","one","notxml","nType","isXMLDoc","attrHooks","propName","attrNames","removeAttribute","tabindex","readonly","for","class","maxlength","cellspacing","cellpadding","rowspan","colspan","usemap","frameborder","contenteditable","propHooks","tabIndex","attributeNode","getAttributeNode","parseInt","href","detail","defaultValue","button","setAttributeNode","createAttribute","parent","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","global","types","handler","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","needsContext","expr","namespace","join","delegateCount","setup","mappedTypes","origCount","RegExp","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","result","noBubble","defaultView","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","matched","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","matches","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","filter","original","which","charCode","keyCode","eventDoc","doc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","focus","activeElement","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","contains","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","bind","unbind","delegate","undelegate","triggerHandler","cachedruns","Expr","getText","isXML","compile","hasDuplicate","outermostContext","setDocument","docElem","documentIsXML","rbuggyQSA","rbuggyMatches","sortOrder","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","strundefined","MAX_NEGATIVE","whitespace","characterEncoding","identifier","operators","pseudos","rcomma","rcombinators","rpseudo","ridentifier","matchExpr","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","rsibling","rnative","rinputs","rheader","rescape","rattributeQuotes","runescape","funescape","escaped","high","fromCharCode","isNative","keys","cacheLength","markFunction","assert","Sizzle","seed","m","groups","old","nid","newContext","newSelector","getByClassName","getElementsByClassName","qsa","tokenize","toSelector","querySelectorAll","qsaError","node","tagNameNoComments","createComment","insertBefore","pass","getElementsByName","getIdNotName","attrHandle","attrId","tag","matchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","b","adown","bup","compare","aup","ap","bp","siblingCheck","detectDuplicates","uniqueSort","duplicates","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","pattern","operator","check","what","simple","forward","ofType","outerCache","nodeIndex","useCache","pseudo","setFilters","idx","not","matcher","unmatched","innerText","lang","elemLang","hash","root","hasFocus","enabled","header","even","odd","lt","gt","radio","checkbox","file","password","image","reset","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","token","filters","runtil","rparentsprev","isSimple","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","andSelf","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","keep","filtered","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","wrapAll","html","wrap","wrapInner","unwrap","replaceWith","domManip","prepend","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","isFunc","table","hasScripts","iNoClone","disableScript","findOrAppend","restoreScript","ajax","url","dataType","throws","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","safe","nodes","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","bool","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","orphans","widows","zIndex","cssProps","float","extra","swap","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","method","success","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getScript","getJSON","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","err","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","unit","tween","createTween","scale","maxIterations","createFxNow","createTweens","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","dataShow","oldfire","handled","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","content","defaultExtra","funcName","define","amd"],"mappings":"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"}
\ No newline at end of file
diff --git a/demo/js/plupload/Moxie.swf b/demo/js/plupload/Moxie.swf
deleted file mode 100644
index 6493572b..00000000
Binary files a/demo/js/plupload/Moxie.swf and /dev/null differ
diff --git a/demo/js/plupload/Moxie.xap b/demo/js/plupload/Moxie.xap
deleted file mode 100644
index 3a9f389f..00000000
Binary files a/demo/js/plupload/Moxie.xap and /dev/null differ
diff --git a/demo/js/plupload/i18n/zh_CN.js b/demo/js/plupload/i18n/zh_CN.js
deleted file mode 100644
index f48e0c43..00000000
--- a/demo/js/plupload/i18n/zh_CN.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// Chinese (China) (zh_CN)
-plupload.addI18n({"Stop Upload":"停止上传","Upload URL might be wrong or doesn't exist.":"上传的URL可能是错误的或不存在。","tb":"tb","Size":"大小","Close":"关闭","Init error.":"初始化错误。","Add files to the upload queue and click the start button.":"将文件添加到上传队列,然后点击”开始上传“按钮。","Filename":"文件名","Image format either wrong or not supported.":"图片格式错误或者不支持。","Status":"状态","HTTP Error.":"HTTP 错误。","Start Upload":"开始上传","mb":"mb","kb":"kb","Duplicate file error.":"重复文件错误。","File size error.":"文件大小错误。","N/A":"N/A","gb":"gb","Error: Invalid file extension:":"错误:无效的文件扩展名:","Select files":"选择文件","%s already present in the queue.":"%s 已经在当前队列里。","File: %s":"文件: %s","b":"b","Uploaded %d/%d files":"已上传 %d/%d 个文件","Upload element accepts only %d file(s) at a time. Extra files were stripped.":"每次只接受同时上传 %d 个文件,多余的文件将会被删除。","%d files queued":"%d 个文件加入到队列","File: %s, size: %d, max file size: %d":"文件: %s, 大小: %d, 最大文件大小: %d","Drag files here.":"把文件拖到这里。","Runtime ran out of available memory.":"运行时已消耗所有可用内存。","File count error.":"文件数量错误。","File extension error.":"文件扩展名错误。","Error: File too large:":"错误: 文件太大:","Add Files":"增加文件"});
\ No newline at end of file
diff --git a/demo/js/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css b/demo/js/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css
deleted file mode 100644
index 1a23a3d8..00000000
--- a/demo/js/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- Plupload
-------------------------------------------------------------------- */
-
-.plupload_button {
- display: -moz-inline-box; /* FF < 3*/
- display: inline-block;
- font: normal 12px sans-serif;
- text-decoration: none;
- color: #42454a;
- border: 1px solid #bababa;
- padding: 2px 8px 3px 20px;
- margin-right: 4px;
- background: #f3f3f3 url('../img/buttons.png') no-repeat 0 center;
- outline: 0;
-
- /* Optional rounded corners for browsers that support it */
- -moz-border-radius: 3px;
- -khtml-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
-}
-
-.plupload_button:hover {
- color: #000;
- text-decoration: none;
-}
-
-.plupload_disabled, a.plupload_disabled:hover {
- color: #737373;
- border-color: #c5c5c5;
- background: #ededed url('../img/buttons-disabled.png') no-repeat 0 center;
- cursor: default;
-}
-
-.plupload_add {
- background-position: -181px center;
-}
-
-.plupload_wrapper {
- font: normal 11px Verdana,sans-serif;
- width: 100%;
-}
-
-.plupload_container {
- padding: 8px;
- background: url('../img/transp50.png');
- /*-moz-border-radius: 5px;*/
-}
-
-.plupload_container input {
- border: 1px solid #DDD;
- font: normal 11px Verdana,sans-serif;
- width: 98%;
-}
-
-.plupload_header {background: #2A2C2E url('../img/backgrounds.gif') repeat-x;}
-.plupload_header_content {
- background: url('../img/backgrounds.gif') no-repeat 0 -317px;
- min-height: 56px;
- padding-left: 60px;
- color: #FFF;
-}
-.plupload_header_title {
- font: normal 18px sans-serif;
- padding: 6px 0 3px;
-}
-.plupload_header_text {
- font: normal 12px sans-serif;
-}
-
-.plupload_filelist {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.plupload_scroll .plupload_filelist {
- height: 185px;
- background: #F5F5F5;
- overflow-y: scroll;
-}
-
-.plupload_filelist li {
- padding: 10px 8px;
- background: #F5F5F5 url('../img/backgrounds.gif') repeat-x 0 -156px;
- border-bottom: 1px solid #DDD;
-}
-
-.plupload_filelist_header, .plupload_filelist_footer {
- background: #DFDFDF;
- padding: 8px 8px;
- color: #42454A;
-}
-.plupload_filelist_header {
- border-top: 1px solid #EEE;
- border-bottom: 1px solid #CDCDCD;
-}
-
-.plupload_filelist_footer {border-top: 1px solid #FFF; height: 22px; line-height: 20px; vertical-align: middle;}
-.plupload_file_name {float: left; overflow: hidden}
-.plupload_file_status {color: #777;}
-.plupload_file_status span {color: #42454A;}
-.plupload_file_size, .plupload_file_status, .plupload_progress {
- float: right;
- width: 80px;
-}
-.plupload_file_size, .plupload_file_status, .plupload_file_action {text-align: right;}
-
-.plupload_filelist .plupload_file_name {
- width: 205px;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.plupload_file_action {
- float: right;
- width: 16px;
- height: 16px;
- margin-left: 15px;
-}
-
-.plupload_file_action * {
- display: none;
- width: 16px;
- height: 16px;
-}
-
-li.plupload_uploading {background: #ECF3DC url('../img/backgrounds.gif') repeat-x 0 -238px;}
-li.plupload_done {color:#AAA}
-
-li.plupload_delete a {
- background: url('../img/delete.gif');
-}
-
-li.plupload_failed a {
- background: url('../img/error.gif');
- cursor: default;
-}
-
-li.plupload_done a {
- background: url('../img/done.gif');
- cursor: default;
-}
-
-.plupload_progress, .plupload_upload_status {
- display: none;
-}
-
-.plupload_progress_container {
- margin-top: 3px;
- border: 1px solid #CCC;
- background: #FFF;
- padding: 1px;
-}
-.plupload_progress_bar {
- width: 0px;
- height: 7px;
- background: #CDEB8B;
-}
-
-.plupload_scroll .plupload_filelist_header .plupload_file_action, .plupload_scroll .plupload_filelist_footer .plupload_file_action {
- margin-right: 17px;
-}
-
-/* Floats */
-
-.plupload_clear,.plupload_clearer {clear: both;}
-.plupload_clearer, .plupload_progress_bar {
- display: block;
- font-size: 0;
- line-height: 0;
-}
-
-li.plupload_droptext {
- background: transparent;
- text-align: center;
- vertical-align: middle;
- border: 0;
- line-height: 165px;
-}
diff --git a/demo/js/plupload/jquery.plupload.queue/img/backgrounds.gif b/demo/js/plupload/jquery.plupload.queue/img/backgrounds.gif
deleted file mode 100644
index 39e33ebc..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/backgrounds.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/buttons-disabled.png b/demo/js/plupload/jquery.plupload.queue/img/buttons-disabled.png
deleted file mode 100644
index afa11af9..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/buttons-disabled.png and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/buttons.png b/demo/js/plupload/jquery.plupload.queue/img/buttons.png
deleted file mode 100644
index 153e7388..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/buttons.png and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/delete.gif b/demo/js/plupload/jquery.plupload.queue/img/delete.gif
deleted file mode 100644
index 78ca8b3b..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/delete.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/done.gif b/demo/js/plupload/jquery.plupload.queue/img/done.gif
deleted file mode 100644
index 29f3ed7c..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/done.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/error.gif b/demo/js/plupload/jquery.plupload.queue/img/error.gif
deleted file mode 100644
index 4682b630..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/error.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/throbber.gif b/demo/js/plupload/jquery.plupload.queue/img/throbber.gif
deleted file mode 100644
index 4ae8b16a..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/throbber.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/img/transp50.png b/demo/js/plupload/jquery.plupload.queue/img/transp50.png
deleted file mode 100644
index eb0efe10..00000000
Binary files a/demo/js/plupload/jquery.plupload.queue/img/transp50.png and /dev/null differ
diff --git a/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.js b/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.js
deleted file mode 100644
index 576920af..00000000
--- a/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.js
+++ /dev/null
@@ -1,424 +0,0 @@
-/**
- * jquery.plupload.queue.js
- *
- * Copyright 2009, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/* global jQuery:true, alert:true */
-
-/**
-jQuery based implementation of the Plupload API - multi-runtime file uploading API.
-
-To use the widget you must include _jQuery_. It is not meant to be extended in any way and is provided to be
-used as it is.
-
-@example
-
-
-
Your browser doesn't have Flash, Silverlight or HTML5 support.
-
-
-
-
-@example
- // Retrieving a reference to plupload.Uploader object
- var uploader = $('#uploader').pluploadQueue();
-
- uploader.bind('FilesAdded', function() {
-
- // Autostart
- setTimeout(uploader.start, 1); // "detach" from the main thread
- });
-
-@class pluploadQueue
-@constructor
-@param {Object} settings For detailed information about each option check documentation.
- @param {String} settings.url URL of the server-side upload handler.
- @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
- @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
- @param {Array} [settings.filters=[]] Set of file type filters, each one defined by hash of title and extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
- @param {String} [settings.flash_swf_url] URL of the Flash swf.
- @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
- @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
- @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
- @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
- @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
- @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
- @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
- @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
- @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
- @param {Number} [settings.resize.width] If image is bigger, it will be resized.
- @param {Number} [settings.resize.height] If image is bigger, it will be resized.
- @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
- @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
- @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
- @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
- @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
-
- @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
- @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
- @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
-*/
-(function($, o) {
- var uploaders = {};
-
- function _(str) {
- return plupload.translate(str) || str;
- }
-
- function renderUI(id, target) {
- // Remove all existing non plupload items
- target.contents().each(function(i, node) {
- node = $(node);
-
- if (!node.is('.plupload')) {
- node.remove();
- }
- });
-
- target.prepend(
- '
'
- );
- }
-
- $.fn.pluploadQueue = function(settings) {
- if (settings) {
- this.each(function() {
- var uploader, target, id, contents_bak;
-
- target = $(this);
- id = target.attr('id');
-
- if (!id) {
- id = plupload.guid();
- target.attr('id', id);
- }
-
- contents_bak = target.html();
- renderUI(id, target);
-
- settings = $.extend({
- dragdrop : true,
- browse_button : id + '_browse',
- container : id
- }, settings);
-
- // Enable drag/drop (see PostInit handler as well)
- if (settings.dragdrop) {
- settings.drop_element = id + '_filelist';
- }
-
- uploader = new plupload.Uploader(settings);
-
- uploaders[id] = uploader;
-
- function handleStatus(file) {
- var actionClass;
-
- if (file.status == plupload.DONE) {
- actionClass = 'plupload_done';
- }
-
- if (file.status == plupload.FAILED) {
- actionClass = 'plupload_failed';
- }
-
- if (file.status == plupload.QUEUED) {
- actionClass = 'plupload_delete';
- }
-
- if (file.status == plupload.UPLOADING) {
- actionClass = 'plupload_uploading';
- }
-
- var icon = $('#' + file.id).attr('class', actionClass).find('a').css('display', 'block');
- if (file.hint) {
- icon.attr('title', file.hint);
- }
- }
-
- function updateTotalProgress() {
- $('span.plupload_total_status', target).html(uploader.total.percent + '%');
- $('div.plupload_progress_bar', target).css('width', uploader.total.percent + '%');
- $('span.plupload_upload_status', target).html(
- o.sprintf(_('Uploaded %d/%d files'), uploader.total.uploaded, uploader.files.length)
- );
- }
-
- function updateList() {
- var fileList = $('ul.plupload_filelist', target).html(''), inputCount = 0, inputHTML;
-
- $.each(uploader.files, function(i, file) {
- inputHTML = '';
-
- if (file.status == plupload.DONE) {
- if (file.target_name) {
- inputHTML += '
';
- }
-
- inputHTML += '
';
- inputHTML += '
';
-
- inputCount++;
-
- $('#' + id + '_count').val(inputCount);
- }
-
- fileList.append(
- '
' +
- '' + file.name + '
' +
- '' +
- '' + file.percent + '%
' +
- '' + plupload.formatSize(file.size) + '
' +
- '
' +
- inputHTML +
- ' '
- );
-
- handleStatus(file);
-
- $('#' + file.id + '.plupload_delete a').click(function(e) {
- $('#' + file.id).remove();
- uploader.removeFile(file);
-
- e.preventDefault();
- });
- });
-
- $('span.plupload_total_file_size', target).html(plupload.formatSize(uploader.total.size));
-
- if (uploader.total.queued === 0) {
- $('span.plupload_add_text', target).html(_('Add Files'));
- } else {
- $('span.plupload_add_text', target).html(o.sprintf(_('%d files queued'), uploader.total.queued));
- }
-
- $('a.plupload_start', target).toggleClass('plupload_disabled', uploader.files.length == (uploader.total.uploaded + uploader.total.failed));
-
- // Scroll to end of file list
- fileList[0].scrollTop = fileList[0].scrollHeight;
-
- updateTotalProgress();
-
- // Re-add drag message if there is no files
- if (!uploader.files.length && uploader.features.dragdrop && uploader.settings.dragdrop) {
- $('#' + id + '_filelist').append('
' + _("Drag files here.") + ' ');
- }
- }
-
- function destroy() {
- delete uploaders[id];
- uploader.destroy();
- target.html(contents_bak);
- uploader = target = contents_bak = null;
- }
-
- uploader.bind("UploadFile", function(up, file) {
- $('#' + file.id).addClass('plupload_current_file');
- });
-
- uploader.bind('Init', function(up, res) {
- // Enable rename support
- if (!settings.unique_names && settings.rename) {
- target.on('click', '#' + id + '_filelist div.plupload_file_name span', function(e) {
- var targetSpan = $(e.target), file, parts, name, ext = "";
-
- // Get file name and split out name and extension
- file = up.getFile(targetSpan.parents('li')[0].id);
- name = file.name;
- parts = /^(.+)(\.[^.]+)$/.exec(name);
- if (parts) {
- name = parts[1];
- ext = parts[2];
- }
-
- // Display input element
- targetSpan.hide().after('
');
- targetSpan.next().val(name).focus().blur(function() {
- targetSpan.show().next().remove();
- }).keydown(function(e) {
- var targetInput = $(this);
-
- if (e.keyCode == 13) {
- e.preventDefault();
-
- // Rename file and glue extension back on
- file.name = targetInput.val() + ext;
- targetSpan.html(file.name);
- targetInput.blur();
- }
- });
- });
- }
-
- $('#' + id + '_container').attr('title', 'Using runtime: ' + res.runtime);
-
- $('a.plupload_start', target).click(function(e) {
- if (!$(this).hasClass('plupload_disabled')) {
- uploader.start();
- }
-
- e.preventDefault();
- });
-
- $('a.plupload_stop', target).click(function(e) {
- e.preventDefault();
- uploader.stop();
- });
-
- $('a.plupload_start', target).addClass('plupload_disabled');
- });
-
- uploader.bind("Error", function(up, err) {
- var file = err.file, message;
-
- if (file) {
- message = err.message;
-
- if (err.details) {
- message += " (" + err.details + ")";
- }
-
- if (err.code == plupload.FILE_SIZE_ERROR) {
- alert(_("Error: File too large:") + " " + file.name);
- }
-
- if (err.code == plupload.FILE_EXTENSION_ERROR) {
- alert(_("Error: Invalid file extension:") + " " + file.name);
- }
-
- file.hint = message;
- $('#' + file.id).attr('class', 'plupload_failed').find('a').css('display', 'block').attr('title', message);
- }
-
- if (err.code === plupload.INIT_ERROR) {
- setTimeout(function() {
- destroy();
- }, 1);
- }
- });
-
- uploader.bind("PostInit", function(up) {
- // features are populated only after input components are fully instantiated
- if (up.settings.dragdrop && up.features.dragdrop) {
- $('#' + id + '_filelist').append('
' + _("Drag files here.") + ' ');
- }
- });
-
- uploader.init();
-
- uploader.bind('StateChanged', function() {
- if (uploader.state === plupload.STARTED) {
- $('li.plupload_delete a,div.plupload_buttons', target).hide();
- $('span.plupload_upload_status,div.plupload_progress,a.plupload_stop', target).css('display', 'block');
- $('span.plupload_upload_status', target).html('Uploaded ' + uploader.total.uploaded + '/' + uploader.files.length + ' files');
-
- if (settings.multiple_queues) {
- $('span.plupload_total_status,span.plupload_total_file_size', target).show();
- }
- } else {
- updateList();
- $('a.plupload_stop,div.plupload_progress', target).hide();
- $('a.plupload_delete', target).css('display', 'block');
-
- if (settings.multiple_queues && uploader.total.uploaded + uploader.total.failed == uploader.files.length) {
- $(".plupload_buttons,.plupload_upload_status", target).css("display", "inline");
- $(".plupload_start", target).addClass("plupload_disabled");
- $('span.plupload_total_status,span.plupload_total_file_size', target).hide();
- }
- }
- });
-
- uploader.bind('FilesAdded', updateList);
-
- uploader.bind('FilesRemoved', function() {
- // since the whole file list is redrawn for every change in the queue
- // we need to scroll back to the file removal point to avoid annoying
- // scrolling to the bottom bug (see #926)
- var scrollTop = $('#' + id + '_filelist').scrollTop();
- updateList();
- $('#' + id + '_filelist').scrollTop(scrollTop);
- });
-
- uploader.bind('FileUploaded', function(up, file) {
- handleStatus(file);
- });
-
- uploader.bind("UploadProgress", function(up, file) {
- // Set file specific progress
- $('#' + file.id + ' div.plupload_file_status', target).html(file.percent + '%');
-
- handleStatus(file);
- updateTotalProgress();
- });
-
- // Call setup function
- if (settings.setup) {
- settings.setup(uploader);
- }
- });
-
- return this;
- } else {
- // Get uploader instance for specified element
- return uploaders[$(this[0]).attr('id')];
- }
- };
-})(jQuery, mOxie);
diff --git a/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.min.js b/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.min.js
deleted file mode 100644
index a38f914a..00000000
--- a/demo/js/plupload/jquery.plupload.queue/jquery.plupload.queue.min.js
+++ /dev/null
@@ -1 +0,0 @@
-;(function(e,t){function r(e){return plupload.translate(e)||e}function i(t,n){n.contents().each(function(t,n){n=e(n),n.is(".plupload")||n.remove()}),n.prepend('
")}var n={};e.fn.pluploadQueue=function(s){return s?(this.each(function(){function c(t){var n;t.status==plupload.DONE&&(n="plupload_done"),t.status==plupload.FAILED&&(n="plupload_failed"),t.status==plupload.QUEUED&&(n="plupload_delete"),t.status==plupload.UPLOADING&&(n="plupload_uploading");var r=e("#"+t.id).attr("class",n).find("a").css("display","block");t.hint&&r.attr("title",t.hint)}function h(){e("span.plupload_total_status",a).html(u.total.percent+"%"),e("div.plupload_progress_bar",a).css("width",u.total.percent+"%"),e("span.plupload_upload_status",a).html(t.sprintf(r("Uploaded %d/%d files"),u.total.uploaded,u.files.length))}function p(){var n=e("ul.plupload_filelist",a).html(""),i=0,s;e.each(u.files,function(t,r){s="",r.status==plupload.DONE&&(r.target_name&&(s+='
'),s+='
',s+='
',i++,e("#"+f+"_count").val(i)),n.append('
'+''+r.name+"
"+''+''+r.percent+"%
"+''+plupload.formatSize(r.size)+"
"+'
'+s+" "),c(r),e("#"+r.id+".plupload_delete a").click(function(t){e("#"+r.id).remove(),u.removeFile(r),t.preventDefault()})}),e("span.plupload_total_file_size",a).html(plupload.formatSize(u.total.size)),u.total.queued===0?e("span.plupload_add_text",a).html(r("Add Files")):e("span.plupload_add_text",a).html(t.sprintf(r("%d files queued"),u.total.queued)),e("a.plupload_start",a).toggleClass("plupload_disabled",u.files.length==u.total.uploaded+u.total.failed),n[0].scrollTop=n[0].scrollHeight,h(),!u.files.length&&u.features.dragdrop&&u.settings.dragdrop&&e("#"+f+"_filelist").append('
'+r("Drag files here.")+" ")}function d(){delete n[f],u.destroy(),a.html(l),u=a=l=null}var u,a,f,l;a=e(this),f=a.attr("id"),f||(f=plupload.guid(),a.attr("id",f)),l=a.html(),i(f,a),s=e.extend({dragdrop:!0,browse_button:f+"_browse",container:f},s),s.dragdrop&&(s.drop_element=f+"_filelist"),u=new plupload.Uploader(s),n[f]=u,u.bind("UploadFile",function(t,n){e("#"+n.id).addClass("plupload_current_file")}),u.bind("Init",function(t,n){!s.unique_names&&s.rename&&a.on("click","#"+f+"_filelist div.plupload_file_name span",function(n){var r=e(n.target),i,s,o,u="";i=t.getFile(r.parents("li")[0].id),o=i.name,s=/^(.+)(\.[^.]+)$/.exec(o),s&&(o=s[1],u=s[2]),r.hide().after('
'),r.next().val(o).focus().blur(function(){r.show().next().remove()}).keydown(function(t){var n=e(this);t.keyCode==13&&(t.preventDefault(),i.name=n.val()+u,r.html(i.name),n.blur())})}),e("#"+f+"_container").attr("title","Using runtime: "+n.runtime),e("a.plupload_start",a).click(function(t){e(this).hasClass("plupload_disabled")||u.start(),t.preventDefault()}),e("a.plupload_stop",a).click(function(e){e.preventDefault(),u.stop()}),e("a.plupload_start",a).addClass("plupload_disabled")}),u.bind("Error",function(t,n){var i=n.file,s;i&&(s=n.message,n.details&&(s+=" ("+n.details+")"),n.code==plupload.FILE_SIZE_ERROR&&alert(r("Error: File too large:")+" "+i.name),n.code==plupload.FILE_EXTENSION_ERROR&&alert(r("Error: Invalid file extension:")+" "+i.name),i.hint=s,e("#"+i.id).attr("class","plupload_failed").find("a").css("display","block").attr("title",s)),n.code===plupload.INIT_ERROR&&setTimeout(function(){d()},1)}),u.bind("PostInit",function(t){t.settings.dragdrop&&t.features.dragdrop&&e("#"+f+"_filelist").append('
'+r("Drag files here.")+" ")}),u.init(),u.bind("StateChanged",function(){u.state===plupload.STARTED?(e("li.plupload_delete a,div.plupload_buttons",a).hide(),e("span.plupload_upload_status,div.plupload_progress,a.plupload_stop",a).css("display","block"),e("span.plupload_upload_status",a).html("Uploaded "+u.total.uploaded+"/"+u.files.length+" files"),s.multiple_queues&&e("span.plupload_total_status,span.plupload_total_file_size",a).show()):(p(),e("a.plupload_stop,div.plupload_progress",a).hide(),e("a.plupload_delete",a).css("display","block"),s.multiple_queues&&u.total.uploaded+u.total.failed==u.files.length&&(e(".plupload_buttons,.plupload_upload_status",a).css("display","inline"),e(".plupload_start",a).addClass("plupload_disabled"),e("span.plupload_total_status,span.plupload_total_file_size",a).hide()))}),u.bind("FilesAdded",p),u.bind("FilesRemoved",function(){var t=e("#"+f+"_filelist").scrollTop();p(),e("#"+f+"_filelist").scrollTop(t)}),u.bind("FileUploaded",function(e,t){c(t)}),u.bind("UploadProgress",function(t,n){e("#"+n.id+" div.plupload_file_status",a).html(n.percent+"%"),c(n),h()}),s.setup&&s.setup(u)}),this):n[e(this[0]).attr("id")]}})(jQuery,mOxie);
\ No newline at end of file
diff --git a/demo/js/plupload/jquery.ui.plupload/css/jquery.ui.plupload.css b/demo/js/plupload/jquery.ui.plupload/css/jquery.ui.plupload.css
deleted file mode 100644
index 739894cf..00000000
--- a/demo/js/plupload/jquery.ui.plupload/css/jquery.ui.plupload.css
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- Plupload
-------------------------------------------------------------------- */
-
-.plupload_button {
- cursor: pointer;
- outline: none;
-}
-
-.plupload_wrapper {
- font: normal 11px Verdana,sans-serif;
- width: 100%;
- min-width: 520px;
-}
-
-.plupload_container {
- _height: 300px;
- min-height: 300px;
- position: relative;
-}
-
-.plupload_filelist_footer {border-width: 1px 0 0 0}
-.plupload_file {border-width: 0 0 1px 0}
-.plupload_container .plupload_header {border-width: 0 0 1px 0; position: relative;}
-
-.plupload_delete .ui-icon,
-.plupload_done .ui-icon,
-.plupload_failed .ui-icon {
- cursor:pointer;
-}
-
-.plupload_header_content {
- height: 56px;
- padding: 0 160px 0 60px;
- position: relative;
-}
-
-.plupload_logo {
- width: 40px;
- height: 40px;
- background: url('../img/plupload.png') no-repeat 0 0;
- position: absolute;
- top: 8px;
- left: 8px;
-}
-
-.plupload_header_content_bw .plupload_logo {
- background-position: -40px 0;
-}
-
-.plupload_header_title {
- font: normal 18px sans-serif;
- padding: 6px 0 3px;
-}
-
-.plupload_header_text {
- font: normal 12px sans-serif;
-}
-
-.plupload_view_switch {
- position: absolute;
- right: 16px;
- bottom: 8px;
- margin: 0;
- display: none;
-}
-
-.plupload_view_switch .ui-button {
- margin-right: -0.31em;
-}
-
-.plupload_content {
- position: absolute;
- top: 87px;
- bottom: 44px;
- left: 0;
- right: 0;
- overflow-y: auto;
- width: 100%;
-}
-
-.plupload_filelist {
- border-collapse: collapse;
- border-left: none;
- border-right: none;
- margin: 0;
- padding: 0;
- width: 100%;
- -moz-user-select: none;
- -webkit-user-select: none;
- user-select: none;
-}
-
-.plupload_filelist_content {
- padding: 0;
- margin: 0;
-}
-
-.plupload_cell {padding: 8px 6px;}
-
-.plupload_file {
- list-style: none;
- display: block;
- position: relative;
- overflow: hidden;
- width: 100%;
-}
-
-.plupload_file_thumb {
- position: absolute;
- left: 6px;
- top: 6px;
- background: #eee url(../img/loading.gif) center no-repeat;
-}
-
-.plupload_file_thumb_loaded .plupload_file_thumb {
- background-image: none;
-}
-
-.plupload_file_name {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.plupload_filelist_header {
- border-top: none;
-}
-
-.plupload_filelist_footer {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-.plupload_buttons {
- position: relative;
-}
-
-/* list view */
-.plupload_view_list .plupload_file {
- border-left: none;
- border-right: none;
- border-top: none;
- height: 29px;
-}
-
-.plupload_view_list div.plupload_file_size,
-.plupload_view_list div.plupload_file_status,
-.plupload_view_list div.plupload_file_action {
- padding: 8px 6px;
- position: absolute;
- top: 0;
- right: 0;
-}
-
-.plupload_view_list div.plupload_file_name {
- margin-right: 156px;
- padding: 8px 6px;
- _width: 75%;
-}
-
-.plupload_view_list div.plupload_file_size {
- right: 28px;
-}
-
-.plupload_view_list div.plupload_file_status {
- right: 82px;
-}
-
-.plupload_view_list .plupload_file_rename {
- margin-left: -2px;
-}
-
-.plupload_view_list .plupload_file_size,
-.plupload_view_list .plupload_file_status,
-.plupload_filelist_footer .plupload_file_size,
-.plupload_filelist_footer .plupload_file_status {
- text-align: right;
- width: 52px;
-}
-
-.plupload_view_list .plupload_file_thumb,
-.plupload_view_list .plupload_file_dummy {
- top: -999px;
-}
-
-.plupload_view_list .plupload_file_progress {
- display: none;
-}
-
-
-/* thumbs view */
-.plupload_view_thumbs .plupload_content {
- top: 57px;
-}
-
-.plupload_view_thumbs .plupload_filelist_header {
- display: none;
-}
-
-.plupload_view_thumbs .plupload_file {
- width: 100px;
- padding: 72px 6px 6px;
- margin: 10px;
- border: 1px solid #fff;
- float: left;
-}
-
-.plupload_view_thumbs .plupload_file_thumb,
-.plupload_view_thumbs .plupload_file_dummy {
- width: 100px;
- height: 60px;
- text-align: center;
- overflow: hidden;
-}
-
-.plupload_view_thumbs .plupload_file_dummy {
- font-size: 21px;
- font-weight: bold;
- text-transform: lowercase;
- overflow: hidden;
- line-height: 60px;
- border: none;
-}
-
-.plupload_view_thumbs div.plupload_file_action {
- position: absolute;
- top: 0;
- right: 0;
-}
-
-.plupload_view_thumbs div.plupload_file_name {
- padding: 0;
- font-weight: bold;
-}
-
-.plupload_view_thumbs .plupload_file_rename {
- padding: 1px 0;
- width: 100% !important;
-}
-
-.plupload_view_thumbs div.plupload_file_size {
- font-size: 0.8em;
- font-weight: normal;
-}
-
-.plupload_view_thumbs div.plupload_file_status {
- position: absolute;
- top: 67px;
- left: 6px;
- width: 100px;
- height: 3px;
- overflow: hidden;
- text-indent: -999px;
-}
-
-.plupload_view_thumbs div.plupload_file_progress {
- border: none;
- height: 100%;
-}
-
-.plupload .ui-sortable-helper,
-.plupload .ui-sortable .plupload_file {
- cursor:move;
-}
-
-.plupload_file_action {width: 16px;}
-.plupload_file_name {
- overflow: hidden;
- padding-left: 10px;
-}
-
-.plupload_file_rename {
- border: none;
- font: normal 11px Verdana, sans-serif;
- padding: 1px 2px;
- line-height: 11px;
- height: 11px;
-}
-
-.plupload_progress {width: 60px;}
-.plupload_progress_container {padding: 1px;}
-
-
-/* Floats */
-
-.plupload_right {float: right;}
-.plupload_left {float: left;}
-.plupload_clear,.plupload_clearer {clear: both;}
-.plupload_clearer, .plupload_progress_bar {
- display: block;
- font-size: 0;
- line-height: 0;
-}
-.plupload_clearer {height: 0;}
-
-/* Misc */
-.plupload_hidden {display: none;}
-
-.plupload_droptext {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: transparent;
- text-align: center;
- vertical-align: middle;
- border: 0;
- line-height: 160px;
- display: none;
-}
-
-.plupload_dropbox .plupload_droptext {
- display: block;
-}
-
-.plupload_buttons, .plupload_upload_status {float: left}
-
-.plupload_message {
- position: absolute;
- top: -1px;
- left: -1px;
- height: 100%;
- width: 100%;
-}
-
-.plupload_message p {
- padding:0.7em;
- margin:0;
-}
-
-.plupload_message strong {
- font-weight: bold;
-}
-
-plupload_message i {
- font-style: italic;
-}
-
-.plupload_message p span.ui-icon {
- float: left;
- margin-right: 0.3em;
-}
-
-.plupload_header_content .ui-state-error,
-.plupload_header_content .ui-state-highlight {
- border:none;
-}
-
-.plupload_message_close {
- position:absolute;
- top:5px;
- right:5px;
- cursor:pointer;
-}
-
-.plupload .ui-sortable-placeholder {
- height:35px;
-}
diff --git a/demo/js/plupload/jquery.ui.plupload/img/loading.gif b/demo/js/plupload/jquery.ui.plupload/img/loading.gif
deleted file mode 100644
index f0109d17..00000000
Binary files a/demo/js/plupload/jquery.ui.plupload/img/loading.gif and /dev/null differ
diff --git a/demo/js/plupload/jquery.ui.plupload/img/plupload.png b/demo/js/plupload/jquery.ui.plupload/img/plupload.png
deleted file mode 100644
index 8ae0f90b..00000000
Binary files a/demo/js/plupload/jquery.ui.plupload/img/plupload.png and /dev/null differ
diff --git a/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.js b/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.js
deleted file mode 100644
index 28fc6c29..00000000
--- a/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.js
+++ /dev/null
@@ -1,1307 +0,0 @@
-/**
- * jquery.ui.plupload.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.widget.js
- * jquery.ui.button.js
- * jquery.ui.progressbar.js
- *
- * Optionally:
- * jquery.ui.sortable.js
- */
-
- /* global jQuery:true */
-
-/**
-jQuery UI based implementation of the Plupload API - multi-runtime file uploading API.
-
-To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
-`ui.progressbar` and `ui.sortable`).
-
-In general the widget is designed the way that you do not usually need to do anything to it after you instantiate it.
-But! You still can intervenue, to some extent, in case you need to. Although, due to the fact that widget is based on
-_jQuery UI_ widget factory, there are some specifics. See examples below for more details.
-
-@example
-
-
-
Your browser doesn't have Flash, Silverlight or HTML5 support.
-
-
-
-
-@example
- // Invoking methods:
- $('#uploader').plupload(options);
-
- // Display welcome message in the notification area
- $('#uploader').plupload('notify', 'info', "This might be obvious, but you need to click 'Add Files' to add some files.");
-
-@example
- // Subscribing to the events...
- // ... on initialization:
- $('#uploader').plupload({
- ...
- viewchanged: function(event, args) {
- // stuff ...
- }
- });
- // ... or after initialization
- $('#uploader').on("viewchanged", function(event, args) {
- // stuff ...
- });
-
-@class UI.Plupload
-@constructor
-@param {Object} settings For detailed information about each option check documentation.
- @param {String} settings.url URL of the server-side upload handler.
- @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
- @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
- @param {Array} [settings.filters=[]] Set of file type filters, each one defined by hash of title and extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
- @param {String} [settings.flash_swf_url] URL of the Flash swf.
- @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
- @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
- @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
- @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
- @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
- @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
- @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
- @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
- @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
- @param {Number} [settings.resize.width] If image is bigger, it will be resized.
- @param {Number} [settings.resize.height] If image is bigger, it will be resized.
- @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
- @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
- @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
- @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
- @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
-
- @param {Boolean} [settings.autostart=false] Whether to auto start uploading right after file selection.
- @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
- @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
- @param {Boolean} [settings.sortable=false] Enable ability to sort files in the queue, changing their uploading priority.
- @param {Object} [settings.buttons] Control the visibility of functional buttons.
- @param {Boolean} [settings.buttons.browse=true] Display browse button.
- @param {Boolean} [settings.buttons.start=true] Display start button.
- @param {Boolean} [settings.buttons.stop=true] Display stop button.
- @param {Object} [settings.views] Control various views of the file queue.
- @param {Boolean} [settings.views.list=true] Enable list view.
- @param {Boolean} [settings.views.thumbs=false] Enable thumbs view.
- @param {String} [settings.views.default='list'] Default view.
- @param {Boolean} [settings.views.remember=true] Whether to remember the current view (requires jQuery Cookie plugin).
- @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
- @param {Number} [settings.max_file_count=0] Limit the number of files user is able to upload in one go, autosets _multiple_queues_ to _false_ (default is 0 - no limit).
-*/
-(function(window, document, plupload, o, $) {
-
-/**
-Dispatched when the widget is initialized and ready.
-
-@event ready
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-*/
-
-/**
-Dispatched when file dialog is closed.
-
-@event selected
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {Array} files Array of selected files represented by plupload.File objects
-*/
-
-/**
-Dispatched when file dialog is closed.
-
-@event removed
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {Array} files Array of removed files represented by plupload.File objects
-*/
-
-/**
-Dispatched when upload is started.
-
-@event start
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-*/
-
-/**
-Dispatched when upload is stopped.
-
-@event stop
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-*/
-
-/**
-Dispatched during the upload process.
-
-@event progress
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {plupload.File} file File that is being uploaded (includes loaded and percent properties among others).
- @param {Number} size Total file size in bytes.
- @param {Number} loaded Number of bytes uploaded of the files total size.
- @param {Number} percent Number of percentage uploaded of the file.
-*/
-
-/**
-Dispatched when file is uploaded.
-
-@event uploaded
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {plupload.File} file File that was uploaded.
- @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
-*/
-
-/**
-Dispatched when upload of the whole queue is complete.
-
-@event complete
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {Array} files Array of uploaded files represented by plupload.File objects
-*/
-
-/**
-Dispatched when the view is changed, e.g. from `list` to `thumbs` or vice versa.
-
-@event viewchanged
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {String} type Current view type.
-*/
-
-/**
-Dispatched when error of some kind is detected.
-
-@event error
-@param {plupload.Uploader} uploader Uploader instance sending the event.
-@param {String} error Error message.
-@param {plupload.File} file File that was uploaded.
- @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
-*/
-
-var uploaders = {};
-
-function _(str) {
- return plupload.translate(str) || str;
-}
-
-function renderUI(obj) {
- obj.id = obj.attr('id');
-
- obj.html(
- '
' +
- '
' +
- '' +
-
- '' +
-
- '
' +
- '
' + _("Drag files here.") + '
' +
- '
' +
- '
' +
- '
' +
-
- '' +
-
- '
' +
- '
' +
- '
'
- );
-}
-
-
-$.widget("ui.plupload", {
-
- widgetEventPrefix: '',
-
- contents_bak: '',
-
- options: {
- browse_button_hover: 'ui-state-hover',
- browse_button_active: 'ui-state-active',
-
- // widget specific
- dragdrop : true,
- multiple_queues: true, // re-use widget by default
- buttons: {
- browse: true,
- start: true,
- stop: true
- },
- views: {
- list: true,
- thumbs: false,
- active: 'list',
- remember: true // requires: https://github.com/carhartl/jquery-cookie, otherwise disabled even if set to true
- },
- autostart: false,
- sortable: false,
- rename: false,
- max_file_count: 0 // unlimited
- },
-
- FILE_COUNT_ERROR: -9001,
-
- _create: function() {
- var id = this.element.attr('id');
- if (!id) {
- id = plupload.guid();
- this.element.attr('id', id);
- }
- this.id = id;
-
- // backup the elements initial state
- this.contents_bak = this.element.html();
- renderUI(this.element);
-
- // container, just in case
- this.container = $('.plupload_container', this.element).attr('id', id + '_container');
-
- this.content = $('.plupload_content', this.element);
-
- if ($.fn.resizable) {
- this.container.resizable({
- handles: 's',
- minHeight: 300
- });
- }
-
- // list of files, may become sortable
- this.filelist = $('.plupload_filelist_content', this.container)
- .attr({
- id: id + '_filelist',
- unselectable: 'on'
- });
-
-
- // buttons
- this.browse_button = $('.plupload_add', this.container).attr('id', id + '_browse');
- this.start_button = $('.plupload_start', this.container).attr('id', id + '_start');
- this.stop_button = $('.plupload_stop', this.container).attr('id', id + '_stop');
- this.thumbs_switcher = $('#' + id + '_view_thumbs');
- this.list_switcher = $('#' + id + '_view_list');
-
- if ($.ui.button) {
- this.browse_button.button({
- icons: { primary: 'ui-icon-circle-plus' },
- disabled: true
- });
-
- this.start_button.button({
- icons: { primary: 'ui-icon-circle-arrow-e' },
- disabled: true
- });
-
- this.stop_button.button({
- icons: { primary: 'ui-icon-circle-close' }
- });
-
- this.list_switcher.button({
- text: false,
- icons: { secondary: "ui-icon-grip-dotted-horizontal" }
- });
-
- this.thumbs_switcher.button({
- text: false,
- icons: { secondary: "ui-icon-image" }
- });
- }
-
- // progressbar
- this.progressbar = $('.plupload_progress_container', this.container);
-
- if ($.ui.progressbar) {
- this.progressbar.progressbar();
- }
-
- // counter
- this.counter = $('.plupload_count', this.element)
- .attr({
- id: id + '_count',
- name: id + '_count'
- });
-
- // initialize uploader instance
- this._initUploader();
- },
-
- _initUploader: function() {
- var self = this
- , id = this.id
- , uploader
- , options = {
- container: id + '_buttons',
- browse_button: id + '_browse'
- }
- ;
-
- $('.plupload_buttons', this.element).attr('id', id + '_buttons');
-
- if (self.options.dragdrop) {
- this.filelist.parent().attr('id', this.id + '_dropbox');
- options.drop_element = this.id + '_dropbox';
- }
-
- uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
-
- if (self.options.views.thumbs) {
- uploader.settings.required_features.display_media = true;
- }
-
-
- uploader.bind('Error', function(up, err) {
- var message, details = "";
-
- message = '
' + err.message + ' ';
-
- switch (err.code) {
- case plupload.FILE_EXTENSION_ERROR:
- details = o.sprintf(_("File: %s"), err.file.name);
- break;
-
- case plupload.FILE_SIZE_ERROR:
- details = o.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, err.file.size, plupload.parseSize(self.options.max_file_size));
- break;
-
- case plupload.FILE_DUPLICATE_ERROR:
- details = o.sprintf(_("%s already present in the queue."), err.file.name);
- break;
-
- case self.FILE_COUNT_ERROR:
- details = o.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), self.options.max_file_count);
- break;
-
- case plupload.IMAGE_FORMAT_ERROR :
- details = _("Image format either wrong or not supported.");
- break;
-
- case plupload.IMAGE_MEMORY_ERROR :
- details = _("Runtime ran out of available memory.");
- break;
-
- /* // This needs a review
- case plupload.IMAGE_DIMENSIONS_ERROR :
- details = o.sprintf(_('Resoultion out of boundaries!
%s runtime supports images only up to %wx%hpx.'), up.runtime, up.features.maxWidth, up.features.maxHeight);
- break; */
-
- case plupload.HTTP_ERROR:
- details = _("Upload URL might be wrong or doesn't exist.");
- break;
- }
-
- message += "
" + details + " ";
-
- self._trigger('error', null, { up: up, error: err } );
-
- // do not show UI if no runtime can be initialized
- if (err.code === plupload.INIT_ERROR) {
- setTimeout(function() {
- self.destroy();
- }, 1);
- } else {
- self.notify('error', message);
- }
- });
-
-
- uploader.bind('PostInit', function(up) {
- // all buttons are optional, so they can be disabled and hidden
- if (!self.options.buttons.browse) {
- self.browse_button.button('disable').hide();
- up.disableBrowse(true);
- } else {
- self.browse_button.button('enable');
- }
-
- if (!self.options.buttons.start) {
- self.start_button.button('disable').hide();
- }
-
- if (!self.options.buttons.stop) {
- self.stop_button.button('disable').hide();
- }
-
- if (!self.options.unique_names && self.options.rename) {
- self._enableRenaming();
- }
-
- if (self.options.dragdrop && up.features.dragdrop) {
- self.filelist.parent().addClass('plupload_dropbox');
- }
-
- self._enableViewSwitcher();
-
- self.start_button.click(function(e) {
- if (!$(this).button('option', 'disabled')) {
- self.start();
- }
- e.preventDefault();
- });
-
- self.stop_button.click(function(e) {
- self.stop();
- e.preventDefault();
- });
-
- self._trigger('ready', null, { up: up });
- });
-
-
- // check if file count doesn't exceed the limit
- if (self.options.max_file_count) {
- self.options.multiple_queues = false; // one go only
-
- uploader.bind('FilesAdded', function(up, selectedFiles) {
- var selectedCount = selectedFiles.length
- , extraCount = up.files.length + selectedCount - self.options.max_file_count
- ;
-
- if (extraCount > 0) {
- selectedFiles.splice(selectedCount - extraCount, extraCount);
-
- up.trigger('Error', {
- code : self.FILE_COUNT_ERROR,
- message : _('File count error.')
- });
- }
- });
- }
-
- // uploader internal events must run first
- uploader.init();
-
- uploader.bind('FileFiltered', function(up, file) {
- self._addFiles(file);
- });
-
- uploader.bind('FilesAdded', function(up, files) {
- self._trigger('selected', null, { up: up, files: files } );
-
- // re-enable sortable
- if (self.options.sortable && $.ui.sortable) {
- self._enableSortingList();
- }
-
- self._trigger('updatelist', null, { filelist: self.filelist });
-
- if (self.options.autostart) {
- // set a little delay to make sure that QueueChanged triggered by the core has time to complete
- setTimeout(function() {
- self.start();
- }, 10);
- }
- });
-
- uploader.bind('FilesRemoved', function(up, files) {
- self._trigger('removed', null, { up: up, files: files } );
- });
-
- uploader.bind('QueueChanged StateChanged', function() {
- self._handleState();
- });
-
- uploader.bind('UploadFile', function(up, file) {
- self._handleFileStatus(file);
- });
-
- uploader.bind('FileUploaded', function(up, file) {
- self._handleFileStatus(file);
- self._trigger('uploaded', null, { up: up, file: file } );
- });
-
- uploader.bind('UploadProgress', function(up, file) {
- self._handleFileStatus(file);
- self._updateTotalProgress();
- self._trigger('progress', null, { up: up, file: file } );
- });
-
- uploader.bind('UploadComplete', function(up, files) {
- self._addFormFields();
- self._trigger('complete', null, { up: up, files: files } );
- });
- },
-
-
- _setOption: function(key, value) {
- var self = this;
-
- if (key == 'buttons' && typeof(value) == 'object') {
- value = $.extend(self.options.buttons, value);
-
- if (!value.browse) {
- self.browse_button.button('disable').hide();
- self.uploader.disableBrowse(true);
- } else {
- self.browse_button.button('enable').show();
- self.uploader.disableBrowse(false);
- }
-
- if (!value.start) {
- self.start_button.button('disable').hide();
- } else {
- self.start_button.button('enable').show();
- }
-
- if (!value.stop) {
- self.stop_button.button('disable').hide();
- } else {
- self.start_button.button('enable').show();
- }
- }
-
- self.uploader.settings[key] = value;
- },
-
-
- /**
- Start upload. Triggers `start` event.
-
- @method start
- */
- start: function() {
- this.uploader.start();
- this._trigger('start', null, { up: this.uploader });
- },
-
-
- /**
- Stop upload. Triggers `stop` event.
-
- @method stop
- */
- stop: function() {
- this.uploader.stop();
- this._trigger('stop', null, { up: this.uploader });
- },
-
-
- /**
- Enable browse button.
-
- @method enable
- */
- enable: function() {
- this.browse_button.button('enable');
- this.uploader.disableBrowse(false);
- },
-
-
- /**
- Disable browse button.
-
- @method disable
- */
- disable: function() {
- this.browse_button.button('disable');
- this.uploader.disableBrowse(true);
- },
-
-
- /**
- Retrieve file by it's unique id.
-
- @method getFile
- @param {String} id Unique id of the file
- @return {plupload.File}
- */
- getFile: function(id) {
- var file;
-
- if (typeof id === 'number') {
- file = this.uploader.files[id];
- } else {
- file = this.uploader.getFile(id);
- }
- return file;
- },
-
- /**
- Return array of files currently in the queue.
-
- @method getFiles
- @return {Array} Array of files in the queue represented by plupload.File objects
- */
- getFiles: function() {
- return this.uploader.files;
- },
-
-
- /**
- Remove the file from the queue.
-
- @method removeFile
- @param {plupload.File|String} file File to remove, might be specified directly or by it's unique id
- */
- removeFile: function(file) {
- if (plupload.typeOf(file) === 'string') {
- file = this.getFile(file);
- }
- this._removeFiles(file);
- },
-
-
- /**
- Clear the file queue.
-
- @method clearQueue
- */
- clearQueue: function() {
- this.uploader.splice();
- },
-
-
- /**
- Retrieve internal plupload.Uploader object (usually not required).
-
- @method getUploader
- @return {plupload.Uploader}
- */
- getUploader: function() {
- return this.uploader;
- },
-
-
- /**
- Trigger refresh procedure, specifically browse_button re-measure and re-position operations.
- Might get handy, when UI Widget is placed within the popup, that is constantly hidden and shown
- again - without calling this method after each show operation, dialog trigger might get displaced
- and disfunctional.
-
- @method refresh
- */
- refresh: function() {
- this.uploader.refresh();
- },
-
-
- /**
- Display a message in notification area.
-
- @method notify
- @param {Enum} type Type of the message, either `error` or `info`
- @param {String} message The text message to display.
- */
- notify: function(type, message) {
- var popup = $(
- '
' +
- '
' +
- '
' + message + '
' +
- '
'
- );
-
- popup
- .addClass('ui-state-' + (type === 'error' ? 'error' : 'highlight'))
- .find('p .ui-icon')
- .addClass('ui-icon-' + (type === 'error' ? 'alert' : 'info'))
- .end()
- .find('.plupload_message_close')
- .click(function() {
- popup.remove();
- })
- .end();
-
- $('.plupload_header', this.container).append(popup);
- },
-
-
- /**
- Destroy the widget, the uploader, free associated resources and bring back original html.
-
- @method destroy
- */
- destroy: function() {
- this._removeFiles([].slice.call(this.uploader.files));
-
- // destroy uploader instance
- this.uploader.destroy();
-
- // unbind all button events
- $('.plupload_button', this.element).unbind();
-
- // destroy buttons
- if ($.ui.button) {
- $('.plupload_add, .plupload_start, .plupload_stop', this.container)
- .button('destroy');
- }
-
- // destroy progressbar
- if ($.ui.progressbar) {
- this.progressbar.progressbar('destroy');
- }
-
- // destroy sortable behavior
- if ($.ui.sortable && this.options.sortable) {
- $('tbody', this.filelist).sortable('destroy');
- }
-
- // restore the elements initial state
- this.element
- .empty()
- .html(this.contents_bak);
- this.contents_bak = '';
-
- $.Widget.prototype.destroy.apply(this);
- },
-
-
- _handleState: function() {
- var up = this.uploader;
-
- if (up.state === plupload.STARTED) {
- $(this.start_button).button('disable');
-
- $([])
- .add(this.stop_button)
- .add('.plupload_started')
- .removeClass('plupload_hidden');
-
- $('.plupload_upload_status', this.element).html(o.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
- $('.plupload_header_content', this.element).addClass('plupload_header_content_bw');
- } else if (up.state === plupload.STOPPED) {
- $([])
- .add(this.stop_button)
- .add('.plupload_started')
- .addClass('plupload_hidden');
-
- if (this.options.multiple_queues) {
- $('.plupload_header_content', this.element).removeClass('plupload_header_content_bw');
- } else {
- $([])
- .add(this.browse_button)
- .add(this.start_button)
- .button('disable');
-
- up.disableBrowse();
- }
-
- if (up.files.length === (up.total.uploaded + up.total.failed)) {
- this.start_button.button('disable');
- } else {
- this.start_button.button('enable');
- }
-
- this._updateTotalProgress();
- }
-
- if (up.total.queued === 0) {
- $('.ui-button-text', this.browse_button).html(_('Add Files'));
- } else {
- $('.ui-button-text', this.browse_button).html(o.sprintf(_('%d files queued'), up.total.queued));
- }
-
- up.refresh();
- },
-
-
- _handleFileStatus: function(file) {
- var self = this, actionClass, iconClass;
-
- // since this method might be called asynchronously, file row might not yet be rendered
- if (!$('#' + file.id).length) {
- return;
- }
-
- switch (file.status) {
- case plupload.DONE:
- actionClass = 'plupload_done';
- iconClass = 'ui-icon ui-icon-circle-check';
- break;
-
- case plupload.FAILED:
- actionClass = 'ui-state-error plupload_failed';
- iconClass = 'ui-icon ui-icon-alert';
- break;
-
- case plupload.QUEUED:
- actionClass = 'plupload_delete';
- iconClass = 'ui-icon ui-icon-circle-minus';
- break;
-
- case plupload.UPLOADING:
- actionClass = 'ui-state-highlight plupload_uploading';
- iconClass = 'ui-icon ui-icon-circle-arrow-w';
-
- // scroll uploading file into the view if its bottom boundary is out of it
- var scroller = $('.plupload_scroll', this.container)
- , scrollTop = scroller.scrollTop()
- , scrollerHeight = scroller.height()
- , rowOffset = $('#' + file.id).position().top + $('#' + file.id).height()
- ;
-
- if (scrollerHeight < rowOffset) {
- scroller.scrollTop(scrollTop + rowOffset - scrollerHeight);
- }
-
- // Set file specific progress
- $('#' + file.id)
- .find('.plupload_file_percent')
- .html(file.percent + '%')
- .end()
- .find('.plupload_file_progress')
- .css('width', file.percent + '%')
- .end()
- .find('.plupload_file_size')
- .html(plupload.formatSize(file.size));
- break;
- }
- actionClass += ' ui-state-default plupload_file';
-
- $('#' + file.id)
- .attr('class', actionClass)
- .find('.ui-icon')
- .attr('class', iconClass)
- .end()
- .filter('.plupload_delete, .plupload_done, .plupload_failed')
- .find('.ui-icon')
- .click(function(e) {
- self._removeFiles(file);
- e.preventDefault();
- });
- },
-
-
- _updateTotalProgress: function() {
- var up = this.uploader;
-
- // Scroll to end of file list
- this.filelist[0].scrollTop = this.filelist[0].scrollHeight;
-
- this.progressbar.progressbar('value', up.total.percent);
-
- this.element
- .find('.plupload_total_status')
- .html(up.total.percent + '%')
- .end()
- .find('.plupload_total_file_size')
- .html(plupload.formatSize(up.total.size))
- .end()
- .find('.plupload_upload_status')
- .html(o.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
- },
-
-
- _displayThumbs: function() {
- var self = this
- , tw, th // thumb width/height
- , cols
- , num = 0 // number of simultaneously visible thumbs
- , thumbs = [] // array of thumbs to preload at any given moment
- , loading = false
- ;
-
- if (!this.options.views.thumbs) {
- return;
- }
-
-
- function onLast(el, eventName, cb) {
- var timer;
-
- el.on(eventName, function() {
- clearTimeout(timer);
- timer = setTimeout(function() {
- clearTimeout(timer);
- cb();
- }, 300);
- });
- }
-
-
- // calculate number of simultaneously visible thumbs
- function measure() {
- if (!tw || !th) {
- var wrapper = $('.plupload_file:eq(0)', self.filelist);
- tw = wrapper.outerWidth(true);
- th = wrapper.outerHeight(true);
- }
-
- var aw = self.content.width(), ah = self.content.height();
- cols = Math.floor(aw / tw);
- num = cols * (Math.ceil(ah / th) + 1);
- }
-
-
- function pickThumbsToLoad() {
- // calculate index of virst visible thumb
- var startIdx = Math.floor(self.content.scrollTop() / th) * cols;
- // get potentially visible thumbs that are not yet visible
- thumbs = $('.plupload_file', self.filelist)
- .slice(startIdx, startIdx + num)
- .filter(':not(.plupload_file_thumb_loaded)')
- .get();
- }
-
-
- function init() {
- function mpl() {
- if (self.view_mode !== 'thumbs') {
- return;
- }
- measure();
- pickThumbsToLoad();
- lazyLoad();
- }
-
- if ($.fn.resizable) {
- onLast(self.container, 'resize', mpl);
- }
-
- onLast(self.window, 'resize', mpl);
- onLast(self.content, 'scroll', mpl);
-
- self.element.on('viewchanged selected', mpl);
-
- mpl();
- }
-
-
- function preloadThumb(file, cb) {
- var img = new o.Image();
-
- img.onload = function() {
- var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist).html('');
- this.embed(thumb[0], {
- width: 100,
- height: 60,
- crop: true,
- swf_url: o.resolveUrl(self.options.flash_swf_url),
- xap_url: o.resolveUrl(self.options.silverlight_xap_url)
- });
- };
-
- img.bind("embedded error", function() {
- $('#' + file.id, self.filelist).addClass('plupload_file_thumb_loaded');
- this.destroy();
- setTimeout(cb, 1); // detach, otherwise ui might hang (in SilverLight for example)
- });
-
- img.load(file.getSource());
- }
-
-
- function lazyLoad() {
- if (self.view_mode !== 'thumbs' || loading) {
- return;
- }
-
- pickThumbsToLoad();
- if (!thumbs.length) {
- return;
- }
-
- loading = true;
-
- preloadThumb(self.getFile($(thumbs.shift()).attr('id')), function() {
- loading = false;
- lazyLoad();
- });
- }
-
- // this has to run only once to measure structures and bind listeners
- this.element.on('selected', function onselected() {
- self.element.off('selected', onselected);
- init();
- });
- },
-
-
- _addFiles: function(files) {
- var self = this, file_html;
-
- file_html = '
' +
- '' +
- '%name%
' +
- '' +
- '%size%
' +
- '' +
- '' +
- '%percent% ' +
- '
' +
- '
' +
- ' ';
-
- if (plupload.typeOf(files) !== 'array') {
- files = [files];
- }
-
- $.each(files, function(i, file) {
- var ext = o.Mime.getFileExtension(file.name) || 'none';
-
- self.filelist.append(file_html.replace(/%(\w+)%/g, function($0, $1) {
- if ('size' === $1) {
- return plupload.formatSize(file.size);
- } else if ('ext' === $1) {
- return ext;
- } else {
- return file[$1] || '';
- }
- }));
-
- self._handleFileStatus(file);
- });
- },
-
-
- _removeFiles: function(files) {
- var self = this, up = this.uploader;
-
- if (plupload.typeOf(files) !== 'array') {
- files = [files];
- }
-
- // destroy sortable if enabled
- if ($.ui.sortable && this.options.sortable) {
- $('tbody', self.filelist).sortable('destroy');
- }
-
- $.each(files, function(i, file) {
- $('#' + file.id).toggle("highlight", function() {
- this.remove();
- });
- up.removeFile(file);
- });
-
-
- if (up.files.length) {
- // re-initialize sortable
- if (this.options.sortable && $.ui.sortable) {
- this._enableSortingList();
- }
- }
-
- this._trigger('updatelist', null, { filelist: this.filelist });
- },
-
-
- _addFormFields: function() {
- var self = this;
-
- // re-add from fresh
- $('.plupload_file_fields', this.filelist).html('');
-
- plupload.each(this.uploader.files, function(file, count) {
- var fields = ''
- , id = self.id + '_' + count
- ;
-
- if (file.target_name) {
- fields += '
';
- }
- fields += '
';
- fields += '
';
-
- $('#' + file.id).find('.plupload_file_fields').html(fields);
- });
-
- this.counter.val(this.uploader.files.length);
- },
-
-
- _viewChanged: function(view) {
- // update or write a new cookie
- if (this.options.views.remember && $.cookie) {
- $.cookie('plupload_ui_view', view, { expires: 7, path: '/' });
- }
-
- // ugly fix for IE6 - make content area stretchable
- if (o.Env.browser === 'IE' && o.Env.version < 7) {
- this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 133 : 103) + ');');
- }
-
- this.container.removeClass('plupload_view_list plupload_view_thumbs').addClass('plupload_view_' + view);
- this.view_mode = view;
- this._trigger('viewchanged', null, { view: view });
- },
-
-
- _enableViewSwitcher: function() {
- var self = this
- , view
- , switcher = $('.plupload_view_switch', this.container)
- , buttons
- , button
- ;
-
- plupload.each(['list', 'thumbs'], function(view) {
- if (!self.options.views[view]) {
- switcher.find('[for="' + self.id + '_view_' + view + '"], #'+ self.id +'_view_' + view).remove();
- }
- });
-
- // check if any visible left
- buttons = switcher.find('.plupload_button');
-
- if (buttons.length === 1) {
- switcher.hide();
- view = buttons.eq(0).data('view');
- this._viewChanged(view);
- } else if ($.ui.button && buttons.length > 1) {
- if (this.options.views.remember && $.cookie) {
- view = $.cookie('plupload_ui_view');
- }
-
- // if wierd case, bail out to default
- if (!~plupload.inArray(view, ['list', 'thumbs'])) {
- view = this.options.views.active;
- }
-
- switcher
- .show()
- .buttonset()
- .find('.ui-button')
- .click(function(e) {
- view = $(this).data('view');
- self._viewChanged(view);
- e.preventDefault(); // avoid auto scrolling to widget in IE and FF (see #850)
- });
-
- // if view not active - happens when switcher wasn't clicked manually
- button = switcher.find('[for="' + self.id + '_view_'+view+'"]');
- if (button.length) {
- button.trigger('click');
- }
- } else {
- switcher.show();
- this._viewChanged(this.options.views.active);
- }
-
- // initialize thumb viewer if requested
- if (this.options.views.thumbs) {
- this._displayThumbs();
- }
- },
-
-
- _enableRenaming: function() {
- var self = this;
-
- this.filelist.dblclick(function(e) {
- var nameSpan = $(e.target), nameInput, file, parts, name, ext = "";
-
- if (!nameSpan.hasClass('plupload_file_namespan')) {
- return;
- }
-
- // Get file name and split out name and extension
- file = self.uploader.getFile(nameSpan.closest('.plupload_file')[0].id);
- name = file.name;
- parts = /^(.+)(\.[^.]+)$/.exec(name);
- if (parts) {
- name = parts[1];
- ext = parts[2];
- }
-
- // Display input element
- nameInput = $('
').width(nameSpan.width()).insertAfter(nameSpan.hide());
- nameInput.val(name).blur(function() {
- nameSpan.show().parent().scrollLeft(0).end().next().remove();
- }).keydown(function(e) {
- var nameInput = $(this);
-
- if ($.inArray(e.keyCode, [13, 27]) !== -1) {
- e.preventDefault();
-
- // Rename file and glue extension back on
- if (e.keyCode === 13) {
- file.name = nameInput.val() + ext;
- nameSpan.html(file.name);
- }
- nameInput.blur();
- }
- })[0].focus();
- });
- },
-
-
- _enableSortingList: function() {
- var self = this;
-
- if ($('.plupload_file', this.filelist).length < 2) {
- return;
- }
-
- // destroy sortable if enabled
- $('tbody', this.filelist).sortable('destroy');
-
- // enable
- this.filelist.sortable({
- items: '.plupload_delete',
-
- cancel: 'object, .plupload_clearer',
-
- stop: function() {
- var files = [];
-
- $.each($(this).sortable('toArray'), function(i, id) {
- files[files.length] = self.uploader.getFile(id);
- });
-
- files.unshift(files.length);
- files.unshift(0);
-
- // re-populate files array
- Array.prototype.splice.apply(self.uploader.files, files);
- }
- });
- }
-});
-
-} (window, document, plupload, mOxie, jQuery));
diff --git a/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.min.js b/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.min.js
deleted file mode 100644
index c7be0ece..00000000
--- a/demo/js/plupload/jquery.ui.plupload/jquery.ui.plupload.min.js
+++ /dev/null
@@ -1 +0,0 @@
-;(function(e,t,n,r,i){function o(e){return n.translate(e)||e}function u(e){e.id=e.attr("id"),e.html('
"+'"+'
'+'
'+o("Drag files here.")+"
"+'
'+'
'+"
"+'"+"
"+'
'+"
")}var s={};i.widget("ui.plupload",{widgetEventPrefix:"",contents_bak:"",options:{browse_button_hover:"ui-state-hover",browse_button_active:"ui-state-active",dragdrop:!0,multiple_queues:!0,buttons:{browse:!0,start:!0,stop:!0},views:{list:!0,thumbs:!1,active:"list",remember:!0},autostart:!1,sortable:!1,rename:!1,max_file_count:0},FILE_COUNT_ERROR:-9001,_create:function(){var e=this.element.attr("id");e||(e=n.guid(),this.element.attr("id",e)),this.id=e,this.contents_bak=this.element.html(),u(this.element),this.container=i(".plupload_container",this.element).attr("id",e+"_container"),this.content=i(".plupload_content",this.element),i.fn.resizable&&this.container.resizable({handles:"s",minHeight:300}),this.filelist=i(".plupload_filelist_content",this.container).attr({id:e+"_filelist",unselectable:"on"}),this.browse_button=i(".plupload_add",this.container).attr("id",e+"_browse"),this.start_button=i(".plupload_start",this.container).attr("id",e+"_start"),this.stop_button=i(".plupload_stop",this.container).attr("id",e+"_stop"),this.thumbs_switcher=i("#"+e+"_view_thumbs"),this.list_switcher=i("#"+e+"_view_list"),i.ui.button&&(this.browse_button.button({icons:{primary:"ui-icon-circle-plus"},disabled:!0}),this.start_button.button({icons:{primary:"ui-icon-circle-arrow-e"},disabled:!0}),this.stop_button.button({icons:{primary:"ui-icon-circle-close"}}),this.list_switcher.button({text:!1,icons:{secondary:"ui-icon-grip-dotted-horizontal"}}),this.thumbs_switcher.button({text:!1,icons:{secondary:"ui-icon-image"}})),this.progressbar=i(".plupload_progress_container",this.container),i.ui.progressbar&&this.progressbar.progressbar(),this.counter=i(".plupload_count",this.element).attr({id:e+"_count",name:e+"_count"}),this._initUploader()},_initUploader:function(){var e=this,t=this.id,u,a={container:t+"_buttons",browse_button:t+"_browse"};i(".plupload_buttons",this.element).attr("id",t+"_buttons"),e.options.dragdrop&&(this.filelist.parent().attr("id",this.id+"_dropbox"),a.drop_element=this.id+"_dropbox"),u=this.uploader=s[t]=new n.Uploader(i.extend(this.options,a)),e.options.views.thumbs&&(u.settings.required_features.display_media=!0),u.bind("Error",function(t,i){var s,u="";s="
"+i.message+" ";switch(i.code){case n.FILE_EXTENSION_ERROR:u=r.sprintf(o("File: %s"),i.file.name);break;case n.FILE_SIZE_ERROR:u=r.sprintf(o("File: %s, size: %d, max file size: %d"),i.file.name,i.file.size,n.parseSize(e.options.max_file_size));break;case n.FILE_DUPLICATE_ERROR:u=r.sprintf(o("%s already present in the queue."),i.file.name);break;case e.FILE_COUNT_ERROR:u=r.sprintf(o("Upload element accepts only %d file(s) at a time. Extra files were stripped."),e.options.max_file_count);break;case n.IMAGE_FORMAT_ERROR:u=o("Image format either wrong or not supported.");break;case n.IMAGE_MEMORY_ERROR:u=o("Runtime ran out of available memory.");break;case n.HTTP_ERROR:u=o("Upload URL might be wrong or doesn't exist.")}s+="
"+u+" ",e._trigger("error",null,{up:t,error:i}),i.code===n.INIT_ERROR?setTimeout(function(){e.destroy()},1):e.notify("error",s)}),u.bind("PostInit",function(t){e.options.buttons.browse?e.browse_button.button("enable"):(e.browse_button.button("disable").hide(),t.disableBrowse(!0)),e.options.buttons.start||e.start_button.button("disable").hide(),e.options.buttons.stop||e.stop_button.button("disable").hide(),!e.options.unique_names&&e.options.rename&&e._enableRenaming(),e.options.dragdrop&&t.features.dragdrop&&e.filelist.parent().addClass("plupload_dropbox"),e._enableViewSwitcher(),e.start_button.click(function(t){i(this).button("option","disabled")||e.start(),t.preventDefault()}),e.stop_button.click(function(t){e.stop(),t.preventDefault()}),e._trigger("ready",null,{up:t})}),e.options.max_file_count&&(e.options.multiple_queues=!1,u.bind("FilesAdded",function(t,n){var r=n.length,i=t.files.length+r-e.options.max_file_count;i>0&&(n.splice(r-i,i),t.trigger("Error",{code:e.FILE_COUNT_ERROR,message:o("File count error.")}))})),u.init(),u.bind("FileFiltered",function(t,n){e._addFiles(n)}),u.bind("FilesAdded",function(t,n){e._trigger("selected",null,{up:t,files:n}),e.options.sortable&&i.ui.sortable&&e._enableSortingList(),e._trigger("updatelist",null,{filelist:e.filelist}),e.options.autostart&&setTimeout(function(){e.start()},10)}),u.bind("FilesRemoved",function(t,n){e._trigger("removed",null,{up:t,files:n})}),u.bind("QueueChanged StateChanged",function(){e._handleState()}),u.bind("UploadFile",function(t,n){e._handleFileStatus(n)}),u.bind("FileUploaded",function(t,n){e._handleFileStatus(n),e._trigger("uploaded",null,{up:t,file:n})}),u.bind("UploadProgress",function(t,n){e._handleFileStatus(n),e._updateTotalProgress(),e._trigger("progress",null,{up:t,file:n})}),u.bind("UploadComplete",function(t,n){e._addFormFields(),e._trigger("complete",null,{up:t,files:n})})},_setOption:function(e,t){var n=this;e=="buttons"&&typeof t=="object"&&(t=i.extend(n.options.buttons,t),t.browse?(n.browse_button.button("enable").show(),n.uploader.disableBrowse(!1)):(n.browse_button.button("disable").hide(),n.uploader.disableBrowse(!0)),t.start?n.start_button.button("enable").show():n.start_button.button("disable").hide(),t.stop?n.start_button.button("enable").show():n.stop_button.button("disable").hide()),n.uploader.settings[e]=t},start:function(){this.uploader.start(),this._trigger("start",null,{up:this.uploader})},stop:function(){this.uploader.stop(),this._trigger("stop",null,{up:this.uploader})},enable:function(){this.browse_button.button("enable"),this.uploader.disableBrowse(!1)},disable:function(){this.browse_button.button("disable"),this.uploader.disableBrowse(!0)},getFile:function(e){var t;return typeof e=="number"?t=this.uploader.files[e]:t=this.uploader.getFile(e),t},getFiles:function(){return this.uploader.files},removeFile:function(e){n.typeOf(e)==="string"&&(e=this.getFile(e)),this._removeFiles(e)},clearQueue:function(){this.uploader.splice()},getUploader:function(){return this.uploader},refresh:function(){this.uploader.refresh()},notify:function(e,t){var n=i('
");n.addClass("ui-state-"+(e==="error"?"error":"highlight")).find("p .ui-icon").addClass("ui-icon-"+(e==="error"?"alert":"info")).end().find(".plupload_message_close").click(function(){n.remove()}).end(),i(".plupload_header",this.container).append(n)},destroy:function(){this._removeFiles([].slice.call(this.uploader.files)),this.uploader.destroy(),i(".plupload_button",this.element).unbind(),i.ui.button&&i(".plupload_add, .plupload_start, .plupload_stop",this.container).button("destroy"),i.ui.progressbar&&this.progressbar.progressbar("destroy"),i.ui.sortable&&this.options.sortable&&i("tbody",this.filelist).sortable("destroy"),this.element.empty().html(this.contents_bak),this.contents_bak="",i.Widget.prototype.destroy.apply(this)},_handleState:function(){var e=this.uploader;e.state===n.STARTED?(i(this.start_button).button("disable"),i([]).add(this.stop_button).add(".plupload_started").removeClass("plupload_hidden"),i(".plupload_upload_status",this.element).html(r.sprintf(o("Uploaded %d/%d files"),e.total.uploaded,e.files.length)),i(".plupload_header_content",this.element).addClass("plupload_header_content_bw")):e.state===n.STOPPED&&(i([]).add(this.stop_button).add(".plupload_started").addClass("plupload_hidden"),this.options.multiple_queues?i(".plupload_header_content",this.element).removeClass("plupload_header_content_bw"):(i([]).add(this.browse_button).add(this.start_button).button("disable"),e.disableBrowse()),e.files.length===e.total.uploaded+e.total.failed?this.start_button.button("disable"):this.start_button.button("enable"),this._updateTotalProgress()),e.total.queued===0?i(".ui-button-text",this.browse_button).html(o("Add Files")):i(".ui-button-text",this.browse_button).html(r.sprintf(o("%d files queued"),e.total.queued)),e.refresh()},_handleFileStatus:function(e){var t=this,r,s;if(!i("#"+e.id).length)return;switch(e.status){case n.DONE:r="plupload_done",s="ui-icon ui-icon-circle-check";break;case n.FAILED:r="ui-state-error plupload_failed",s="ui-icon ui-icon-alert";break;case n.QUEUED:r="plupload_delete",s="ui-icon ui-icon-circle-minus";break;case n.UPLOADING:r="ui-state-highlight plupload_uploading",s="ui-icon ui-icon-circle-arrow-w";var o=i(".plupload_scroll",this.container),u=o.scrollTop(),a=o.height(),f=i("#"+e.id).position().top+i("#"+e.id).height();a
%name%
%size%
%percent%
',n.typeOf(e)!=="array"&&(e=[e]),i.each(e,function(e,i){var o=r.Mime.getFileExtension(i.name)||"none";t.filelist.append(s.replace(/%(\w+)%/g,function(e,t){return"size"===t?n.formatSize(i.size):"ext"===t?o:i[t]||""})),t._handleFileStatus(i)})},_removeFiles:function(e){var t=this,r=this.uploader;n.typeOf(e)!=="array"&&(e=[e]),i.ui.sortable&&this.options.sortable&&i("tbody",t.filelist).sortable("destroy"),i.each(e,function(e,t){i("#"+t.id).toggle("highlight",function(){this.remove()}),r.removeFile(t)}),r.files.length&&this.options.sortable&&i.ui.sortable&&this._enableSortingList(),this._trigger("updatelist",null,{filelist:this.filelist})},_addFormFields:function(){var e=this;i(".plupload_file_fields",this.filelist).html(""),n.each(this.uploader.files,function(t,r){var s="",o=e.id+"_"+r;t.target_name&&(s+=' '),s+=' ',s+=' ',i("#"+t.id).find(".plupload_file_fields").html(s)}),this.counter.val(this.uploader.files.length)},_viewChanged:function(e){this.options.views.remember&&i.cookie&&i.cookie("plupload_ui_view",e,{expires:7,path:"/"}),r.Env.browser==="IE"&&r.Env.version<7&&this.content.attr("style",'height:expression(document.getElementById("'+this.id+"_container"+'").clientHeight - '+(e==="list"?133:103)+");"),this.container.removeClass("plupload_view_list plupload_view_thumbs").addClass("plupload_view_"+e),this.view_mode=e,this._trigger("viewchanged",null,{view:e})},_enableViewSwitcher:function(){var e=this,t,r=i(".plupload_view_switch",this.container),s,o;n.each(["list","thumbs"],function(t){e.options.views[t]||r.find('[for="'+e.id+"_view_"+t+'"], #'+e.id+"_view_"+t).remove()}),s=r.find(".plupload_button"),s.length===1?(r.hide(),t=s.eq(0).data("view"),this._viewChanged(t)):i.ui.button&&s.length>1?(this.options.views.remember&&i.cookie&&(t=i.cookie("plupload_ui_view")),~n.inArray(t,["list","thumbs"])||(t=this.options.views.active),r.show().buttonset().find(".ui-button").click(function(n){t=i(this).data("view"),e._viewChanged(t),n.preventDefault()}),o=r.find('[for="'+e.id+"_view_"+t+'"]'),o.length&&o.trigger("click")):(r.show(),this._viewChanged(this.options.views.active)),this.options.views.thumbs&&this._displayThumbs()},_enableRenaming:function(){var e=this;this.filelist.dblclick(function(t){var n=i(t.target),r,s,o,u,a="";if(!n.hasClass("plupload_file_namespan"))return;s=e.uploader.getFile(n.closest(".plupload_file")[0].id),u=s.name,o=/^(.+)(\.[^.]+)$/.exec(u),o&&(u=o[1],a=o[2]),r=i(' ').width(n.width()).insertAfter(n.hide()),r.val(u).blur(function(){n.show().parent().scrollLeft(0).end().next().remove()}).keydown(function(e){var t=i(this);i.inArray(e.keyCode,[13,27])!==-1&&(e.preventDefault(),e.keyCode===13&&(s.name=t.val()+a,n.html(s.name)),t.blur())})[0].focus()})},_enableSortingList:function(){var e=this;if(i(".plupload_file",this.filelist).length<2)return;i("tbody",this.filelist).sortable("destroy"),this.filelist.sortable({items:".plupload_delete",cancel:"object, .plupload_clearer",stop:function(){var t=[];i.each(i(this).sortable("toArray"),function(n,r){t[t.length]=e.uploader.getFile(r)}),t.unshift(t.length),t.unshift(0),Array.prototype.splice.apply(e.uploader.files,t)}})}})})(window,document,plupload,mOxie,jQuery);
\ No newline at end of file
diff --git a/demo/js/plupload/moxie.js b/demo/js/plupload/moxie.js
deleted file mode 100644
index afd0aec4..00000000
--- a/demo/js/plupload/moxie.js
+++ /dev/null
@@ -1,10684 +0,0 @@
-/**
- * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill
- * v1.2.0
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-/**
- * Compiled inline version. (Library mode)
- */
-
-/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */
-/*globals $code */
-
-(function(exports, undefined) {
- "use strict";
-
- var modules = {};
-
- function require(ids, callback) {
- var module, defs = [];
-
- for (var i = 0; i < ids.length; ++i) {
- module = modules[ids[i]] || resolve(ids[i]);
- if (!module) {
- throw 'module definition dependecy not found: ' + ids[i];
- }
-
- defs.push(module);
- }
-
- callback.apply(null, defs);
- }
-
- function define(id, dependencies, definition) {
- if (typeof id !== 'string') {
- throw 'invalid module definition, module id must be defined and be a string';
- }
-
- if (dependencies === undefined) {
- throw 'invalid module definition, dependencies must be specified';
- }
-
- if (definition === undefined) {
- throw 'invalid module definition, definition function must be specified';
- }
-
- require(dependencies, function() {
- modules[id] = definition.apply(null, arguments);
- });
- }
-
- function defined(id) {
- return !!modules[id];
- }
-
- function resolve(id) {
- var target = exports;
- var fragments = id.split(/[.\/]/);
-
- for (var fi = 0; fi < fragments.length; ++fi) {
- if (!target[fragments[fi]]) {
- return;
- }
-
- target = target[fragments[fi]];
- }
-
- return target;
- }
-
- function expose(ids) {
- for (var i = 0; i < ids.length; i++) {
- var target = exports;
- var id = ids[i];
- var fragments = id.split(/[.\/]/);
-
- for (var fi = 0; fi < fragments.length - 1; ++fi) {
- if (target[fragments[fi]] === undefined) {
- target[fragments[fi]] = {};
- }
-
- target = target[fragments[fi]];
- }
-
- target[fragments[fragments.length - 1]] = modules[id];
- }
- }
-
-// Included from: src/javascript/core/utils/Basic.js
-
-/**
- * Basic.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Basic', [], function() {
- /**
- Gets the true type of the built-in object (better version of typeof).
- @author Angus Croll (http://javascriptweblog.wordpress.com/)
-
- @method typeOf
- @for Utils
- @static
- @param {Object} o Object to check.
- @return {String} Object [[Class]]
- */
- var typeOf = function(o) {
- var undef;
-
- if (o === undef) {
- return 'undefined';
- } else if (o === null) {
- return 'null';
- } else if (o.nodeType) {
- return 'node';
- }
-
- // the snippet below is awesome, however it fails to detect null, undefined and arguments types in IE lte 8
- return ({}).toString.call(o).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
- };
-
- /**
- Extends the specified object with another object.
-
- @method extend
- @static
- @param {Object} target Object to extend.
- @param {Object} [obj]* Multiple objects to extend with.
- @return {Object} Same as target, the extended object.
- */
- var extend = function(target) {
- var undef;
-
- each(arguments, function(arg, i) {
- if (i > 0) {
- each(arg, function(value, key) {
- if (value !== undef) {
- if (typeOf(target[key]) === typeOf(value) && !!~inArray(typeOf(value), ['array', 'object'])) {
- extend(target[key], value);
- } else {
- target[key] = value;
- }
- }
- });
- }
- });
- return target;
- };
-
- /**
- Executes the callback function for each item in array/object. If you return false in the
- callback it will break the loop.
-
- @method each
- @static
- @param {Object} obj Object to iterate.
- @param {function} callback Callback function to execute for each item.
- */
- var each = function(obj, callback) {
- var length, key, i, undef;
-
- if (obj) {
- try {
- length = obj.length;
- } catch(ex) {
- length = undef;
- }
-
- if (length === undef) {
- // Loop object items
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (callback(obj[key], key) === false) {
- return;
- }
- }
- }
- } else {
- // Loop array items
- for (i = 0; i < length; i++) {
- if (callback(obj[i], i) === false) {
- return;
- }
- }
- }
- }
- };
-
- /**
- Checks if object is empty.
-
- @method isEmptyObj
- @static
- @param {Object} o Object to check.
- @return {Boolean}
- */
- var isEmptyObj = function(obj) {
- var prop;
-
- if (!obj || typeOf(obj) !== 'object') {
- return true;
- }
-
- for (prop in obj) {
- return false;
- }
-
- return true;
- };
-
- /**
- Recieve an array of functions (usually async) to call in sequence, each function
- receives a callback as first argument that it should call, when it completes. Finally,
- after everything is complete, main callback is called. Passing truthy value to the
- callback as a first argument will interrupt the sequence and invoke main callback
- immediately.
-
- @method inSeries
- @static
- @param {Array} queue Array of functions to call in sequence
- @param {Function} cb Main callback that is called in the end, or in case of erro
- */
- var inSeries = function(queue, cb) {
- var i = 0, length = queue.length;
-
- if (typeOf(cb) !== 'function') {
- cb = function() {};
- }
-
- if (!queue || !queue.length) {
- cb();
- }
-
- function callNext(i) {
- if (typeOf(queue[i]) === 'function') {
- queue[i](function(error) {
- /*jshint expr:true */
- ++i < length && !error ? callNext(i) : cb(error);
- });
- }
- }
- callNext(i);
- };
-
-
- /**
- Recieve an array of functions (usually async) to call in parallel, each function
- receives a callback as first argument that it should call, when it completes. After
- everything is complete, main callback is called. Passing truthy value to the
- callback as a first argument will interrupt the process and invoke main callback
- immediately.
-
- @method inParallel
- @static
- @param {Array} queue Array of functions to call in sequence
- @param {Function} cb Main callback that is called in the end, or in case of erro
- */
- var inParallel = function(queue, cb) {
- var count = 0, num = queue.length, cbArgs = new Array(num);
-
- each(queue, function(fn, i) {
- fn(function(error) {
- if (error) {
- return cb(error);
- }
-
- var args = [].slice.call(arguments);
- args.shift(); // strip error - undefined or not
-
- cbArgs[i] = args;
- count++;
-
- if (count === num) {
- cbArgs.unshift(null);
- cb.apply(this, cbArgs);
- }
- });
- });
- };
-
-
- /**
- Find an element in array and return it's index if present, otherwise return -1.
-
- @method inArray
- @static
- @param {Mixed} needle Element to find
- @param {Array} array
- @return {Int} Index of the element, or -1 if not found
- */
- var inArray = function(needle, array) {
- if (array) {
- if (Array.prototype.indexOf) {
- return Array.prototype.indexOf.call(array, needle);
- }
-
- for (var i = 0, length = array.length; i < length; i++) {
- if (array[i] === needle) {
- return i;
- }
- }
- }
- return -1;
- };
-
-
- /**
- Returns elements of first array if they are not present in second. And false - otherwise.
-
- @private
- @method arrayDiff
- @param {Array} needles
- @param {Array} array
- @return {Array|Boolean}
- */
- var arrayDiff = function(needles, array) {
- var diff = [];
-
- if (typeOf(needles) !== 'array') {
- needles = [needles];
- }
-
- if (typeOf(array) !== 'array') {
- array = [array];
- }
-
- for (var i in needles) {
- if (inArray(needles[i], array) === -1) {
- diff.push(needles[i]);
- }
- }
- return diff.length ? diff : false;
- };
-
-
- /**
- Find intersection of two arrays.
-
- @private
- @method arrayIntersect
- @param {Array} array1
- @param {Array} array2
- @return {Array} Intersection of two arrays or null if there is none
- */
- var arrayIntersect = function(array1, array2) {
- var result = [];
- each(array1, function(item) {
- if (inArray(item, array2) !== -1) {
- result.push(item);
- }
- });
- return result.length ? result : null;
- };
-
-
- /**
- Forces anything into an array.
-
- @method toArray
- @static
- @param {Object} obj Object with length field.
- @return {Array} Array object containing all items.
- */
- var toArray = function(obj) {
- var i, arr = [];
-
- for (i = 0; i < obj.length; i++) {
- arr[i] = obj[i];
- }
-
- return arr;
- };
-
-
- /**
- Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers.
- The only way a user would be able to get the same ID is if the two persons at the same exact milisecond manages
- to get 5 the same random numbers between 0-65535 it also uses a counter so each call will be guaranteed to be page unique.
- It's more probable for the earth to be hit with an ansteriod. Y
-
- @method guid
- @static
- @param {String} prefix to prepend (by default 'o' will be prepended).
- @method guid
- @return {String} Virtually unique id.
- */
- var guid = (function() {
- var counter = 0;
-
- return function(prefix) {
- var guid = new Date().getTime().toString(32), i;
-
- for (i = 0; i < 5; i++) {
- guid += Math.floor(Math.random() * 65535).toString(32);
- }
-
- return (prefix || 'o_') + guid + (counter++).toString(32);
- };
- }());
-
-
- /**
- Trims white spaces around the string
-
- @method trim
- @static
- @param {String} str
- @return {String}
- */
- var trim = function(str) {
- if (!str) {
- return str;
- }
- return String.prototype.trim ? String.prototype.trim.call(str) : str.toString().replace(/^\s*/, '').replace(/\s*$/, '');
- };
-
-
- /**
- Parses the specified size string into a byte value. For example 10kb becomes 10240.
-
- @method parseSizeStr
- @static
- @param {String/Number} size String to parse or number to just pass through.
- @return {Number} Size in bytes.
- */
- var parseSizeStr = function(size) {
- if (typeof(size) !== 'string') {
- return size;
- }
-
- var muls = {
- t: 1099511627776,
- g: 1073741824,
- m: 1048576,
- k: 1024
- },
- mul;
-
- size = /^([0-9]+)([mgk]?)$/.exec(size.toLowerCase().replace(/[^0-9mkg]/g, ''));
- mul = size[2];
- size = +size[1];
-
- if (muls.hasOwnProperty(mul)) {
- size *= muls[mul];
- }
- return size;
- };
-
-
- return {
- guid: guid,
- typeOf: typeOf,
- extend: extend,
- each: each,
- isEmptyObj: isEmptyObj,
- inSeries: inSeries,
- inParallel: inParallel,
- inArray: inArray,
- arrayDiff: arrayDiff,
- arrayIntersect: arrayIntersect,
- toArray: toArray,
- trim: trim,
- parseSizeStr: parseSizeStr
- };
-});
-
-// Included from: src/javascript/core/I18n.js
-
-/**
- * I18n.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/I18n", [
- "moxie/core/utils/Basic"
-], function(Basic) {
- var i18n = {};
-
- return {
- /**
- * Extends the language pack object with new items.
- *
- * @param {Object} pack Language pack items to add.
- * @return {Object} Extended language pack object.
- */
- addI18n: function(pack) {
- return Basic.extend(i18n, pack);
- },
-
- /**
- * Translates the specified string by checking for the english string in the language pack lookup.
- *
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- translate: function(str) {
- return i18n[str] || str;
- },
-
- /**
- * Shortcut for translate function
- *
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- _: function(str) {
- return this.translate(str);
- },
-
- /**
- * Pseudo sprintf implementation - simple way to replace tokens with specified values.
- *
- * @param {String} str String with tokens
- * @return {String} String with replaced tokens
- */
- sprintf: function(str) {
- var args = [].slice.call(arguments, 1);
-
- return str.replace(/%[a-z]/g, function() {
- var value = args.shift();
- return Basic.typeOf(value) !== 'undefined' ? value : '';
- });
- }
- };
-});
-
-// Included from: src/javascript/core/utils/Mime.js
-
-/**
- * Mime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/utils/Mime", [
- "moxie/core/utils/Basic",
- "moxie/core/I18n"
-], function(Basic, I18n) {
-
- var mimeData = "" +
- "application/msword,doc dot," +
- "application/pdf,pdf," +
- "application/pgp-signature,pgp," +
- "application/postscript,ps ai eps," +
- "application/rtf,rtf," +
- "application/vnd.ms-excel,xls xlb," +
- "application/vnd.ms-powerpoint,ppt pps pot," +
- "application/zip,zip," +
- "application/x-shockwave-flash,swf swfl," +
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx," +
- "application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx," +
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx," +
- "application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx," +
- "application/vnd.openxmlformats-officedocument.presentationml.template,potx," +
- "application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx," +
- "application/x-javascript,js," +
- "application/json,json," +
- "audio/mpeg,mp3 mpga mpega mp2," +
- "audio/x-wav,wav," +
- "audio/x-m4a,m4a," +
- "audio/ogg,oga ogg," +
- "audio/aiff,aiff aif," +
- "audio/flac,flac," +
- "audio/aac,aac," +
- "audio/ac3,ac3," +
- "audio/x-ms-wma,wma," +
- "image/bmp,bmp," +
- "image/gif,gif," +
- "image/jpeg,jpg jpeg jpe," +
- "image/photoshop,psd," +
- "image/png,png," +
- "image/svg+xml,svg svgz," +
- "image/tiff,tiff tif," +
- "text/plain,asc txt text diff log," +
- "text/html,htm html xhtml," +
- "text/css,css," +
- "text/csv,csv," +
- "text/rtf,rtf," +
- "video/mpeg,mpeg mpg mpe m2v," +
- "video/quicktime,qt mov," +
- "video/mp4,mp4," +
- "video/x-m4v,m4v," +
- "video/x-flv,flv," +
- "video/x-ms-wmv,wmv," +
- "video/avi,avi," +
- "video/webm,webm," +
- "video/3gpp,3gpp 3gp," +
- "video/3gpp2,3g2," +
- "video/vnd.rn-realvideo,rv," +
- "video/ogg,ogv," +
- "video/x-matroska,mkv," +
- "application/vnd.oasis.opendocument.formula-template,otf," +
- "application/octet-stream,exe";
-
-
- var Mime = {
-
- mimes: {},
-
- extensions: {},
-
- // Parses the default mime types string into a mimes and extensions lookup maps
- addMimeType: function (mimeData) {
- var items = mimeData.split(/,/), i, ii, ext;
-
- for (i = 0; i < items.length; i += 2) {
- ext = items[i + 1].split(/ /);
-
- // extension to mime lookup
- for (ii = 0; ii < ext.length; ii++) {
- this.mimes[ext[ii]] = items[i];
- }
- // mime to extension lookup
- this.extensions[items[i]] = ext;
- }
- },
-
-
- extList2mimes: function (filters, addMissingExtensions) {
- var self = this, ext, i, ii, type, mimes = [];
-
- // convert extensions to mime types list
- for (i = 0; i < filters.length; i++) {
- ext = filters[i].extensions.split(/\s*,\s*/);
-
- for (ii = 0; ii < ext.length; ii++) {
-
- // if there's an asterisk in the list, then accept attribute is not required
- if (ext[ii] === '*') {
- return [];
- }
-
- type = self.mimes[ext[ii]];
- if (!type) {
- if (addMissingExtensions && /^\w+$/.test(ext[ii])) {
- mimes.push('.' + ext[ii]);
- } else {
- return []; // accept all
- }
- } else if (Basic.inArray(type, mimes) === -1) {
- mimes.push(type);
- }
- }
- }
- return mimes;
- },
-
-
- mimes2exts: function(mimes) {
- var self = this, exts = [];
-
- Basic.each(mimes, function(mime) {
- if (mime === '*') {
- exts = [];
- return false;
- }
-
- // check if this thing looks like mime type
- var m = mime.match(/^(\w+)\/(\*|\w+)$/);
- if (m) {
- if (m[2] === '*') {
- // wildcard mime type detected
- Basic.each(self.extensions, function(arr, mime) {
- if ((new RegExp('^' + m[1] + '/')).test(mime)) {
- [].push.apply(exts, self.extensions[mime]);
- }
- });
- } else if (self.extensions[mime]) {
- [].push.apply(exts, self.extensions[mime]);
- }
- }
- });
- return exts;
- },
-
-
- mimes2extList: function(mimes) {
- var accept = [], exts = [];
-
- if (Basic.typeOf(mimes) === 'string') {
- mimes = Basic.trim(mimes).split(/\s*,\s*/);
- }
-
- exts = this.mimes2exts(mimes);
-
- accept.push({
- title: I18n.translate('Files'),
- extensions: exts.length ? exts.join(',') : '*'
- });
-
- // save original mimes string
- accept.mimes = mimes;
-
- return accept;
- },
-
-
- getFileExtension: function(fileName) {
- var matches = fileName && fileName.match(/\.([^.]+)$/);
- if (matches) {
- return matches[1].toLowerCase();
- }
- return '';
- },
-
- getFileMime: function(fileName) {
- return this.mimes[this.getFileExtension(fileName)] || '';
- }
- };
-
- Mime.addMimeType(mimeData);
-
- return Mime;
-});
-
-// Included from: src/javascript/core/utils/Env.js
-
-/**
- * Env.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/utils/Env", [
- "moxie/core/utils/Basic"
-], function(Basic) {
-
- // UAParser.js v0.6.2
- // Lightweight JavaScript-based User-Agent string parser
- // https://github.com/faisalman/ua-parser-js
- //
- // Copyright © 2012-2013 Faisalman
- // Dual licensed under GPLv2 & MIT
-
- var UAParser = (function (undefined) {
-
- //////////////
- // Constants
- /////////////
-
-
- var EMPTY = '',
- UNKNOWN = '?',
- FUNC_TYPE = 'function',
- UNDEF_TYPE = 'undefined',
- OBJ_TYPE = 'object',
- MAJOR = 'major',
- MODEL = 'model',
- NAME = 'name',
- TYPE = 'type',
- VENDOR = 'vendor',
- VERSION = 'version',
- ARCHITECTURE= 'architecture',
- CONSOLE = 'console',
- MOBILE = 'mobile',
- TABLET = 'tablet';
-
-
- ///////////
- // Helper
- //////////
-
-
- var util = {
- has : function (str1, str2) {
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
- },
- lowerize : function (str) {
- return str.toLowerCase();
- }
- };
-
-
- ///////////////
- // Map helper
- //////////////
-
-
- var mapper = {
-
- rgx : function () {
-
- // loop through all regexes maps
- for (var result, i = 0, j, k, p, q, matches, match, args = arguments; i < args.length; i += 2) {
-
- var regex = args[i], // even sequence (0,2,4,..)
- props = args[i + 1]; // odd sequence (1,3,5,..)
-
- // construct object barebones
- if (typeof(result) === UNDEF_TYPE) {
- result = {};
- for (p in props) {
- q = props[p];
- if (typeof(q) === OBJ_TYPE) {
- result[q[0]] = undefined;
- } else {
- result[q] = undefined;
- }
- }
- }
-
- // try matching uastring with regexes
- for (j = k = 0; j < regex.length; j++) {
- matches = regex[j].exec(this.getUA());
- if (!!matches) {
- for (p = 0; p < props.length; p++) {
- match = matches[++k];
- q = props[p];
- // check if given property is actually array
- if (typeof(q) === OBJ_TYPE && q.length > 0) {
- if (q.length == 2) {
- if (typeof(q[1]) == FUNC_TYPE) {
- // assign modified match
- result[q[0]] = q[1].call(this, match);
- } else {
- // assign given value, ignore regex match
- result[q[0]] = q[1];
- }
- } else if (q.length == 3) {
- // check whether function or regex
- if (typeof(q[1]) === FUNC_TYPE && !(q[1].exec && q[1].test)) {
- // call function (usually string mapper)
- result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
- } else {
- // sanitize match using given regex
- result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
- }
- } else if (q.length == 4) {
- result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
- }
- } else {
- result[q] = match ? match : undefined;
- }
- }
- break;
- }
- }
-
- if(!!matches) break; // break the loop immediately if match found
- }
- return result;
- },
-
- str : function (str, map) {
-
- for (var i in map) {
- // check if array
- if (typeof(map[i]) === OBJ_TYPE && map[i].length > 0) {
- for (var j = 0; j < map[i].length; j++) {
- if (util.has(map[i][j], str)) {
- return (i === UNKNOWN) ? undefined : i;
- }
- }
- } else if (util.has(map[i], str)) {
- return (i === UNKNOWN) ? undefined : i;
- }
- }
- return str;
- }
- };
-
-
- ///////////////
- // String map
- //////////////
-
-
- var maps = {
-
- browser : {
- oldsafari : {
- major : {
- '1' : ['/8', '/1', '/3'],
- '2' : '/4',
- '?' : '/'
- },
- version : {
- '1.0' : '/8',
- '1.2' : '/1',
- '1.3' : '/3',
- '2.0' : '/412',
- '2.0.2' : '/416',
- '2.0.3' : '/417',
- '2.0.4' : '/419',
- '?' : '/'
- }
- }
- },
-
- device : {
- sprint : {
- model : {
- 'Evo Shift 4G' : '7373KT'
- },
- vendor : {
- 'HTC' : 'APA',
- 'Sprint' : 'Sprint'
- }
- }
- },
-
- os : {
- windows : {
- version : {
- 'ME' : '4.90',
- 'NT 3.11' : 'NT3.51',
- 'NT 4.0' : 'NT4.0',
- '2000' : 'NT 5.0',
- 'XP' : ['NT 5.1', 'NT 5.2'],
- 'Vista' : 'NT 6.0',
- '7' : 'NT 6.1',
- '8' : 'NT 6.2',
- '8.1' : 'NT 6.3',
- 'RT' : 'ARM'
- }
- }
- }
- };
-
-
- //////////////
- // Regex map
- /////////////
-
-
- var regexes = {
-
- browser : [[
-
- // Presto based
- /(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini
- /(opera\s[mobiletab]+).+version\/((\d+)?[\w\.-]+)/i, // Opera Mobi/Tablet
- /(opera).+version\/((\d+)?[\w\.]+)/i, // Opera > 9.80
- /(opera)[\/\s]+((\d+)?[\w\.]+)/i // Opera < 9.80
-
- ], [NAME, VERSION, MAJOR], [
-
- /\s(opr)\/((\d+)?[\w\.]+)/i // Opera Webkit
- ], [[NAME, 'Opera'], VERSION, MAJOR], [
-
- // Mixed
- /(kindle)\/((\d+)?[\w\.]+)/i, // Kindle
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?((\d+)?[\w\.]+)*/i,
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
-
- // Trident based
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?((\d+)?[\w\.]*)/i,
- // Avant/IEMobile/SlimBrowser/Baidu
- /(?:ms|\()(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer
-
- // Webkit/KHTML based
- /(rekonq)((?:\/)[\w\.]+)*/i, // Rekonq
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron)\/((\d+)?[\w\.-]+)/i
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron
- ], [NAME, VERSION, MAJOR], [
-
- /(trident).+rv[:\s]((\d+)?[\w\.]+).+like\sgecko/i // IE11
- ], [[NAME, 'IE'], VERSION, MAJOR], [
-
- /(yabrowser)\/((\d+)?[\w\.]+)/i // Yandex
- ], [[NAME, 'Yandex'], VERSION, MAJOR], [
-
- /(comodo_dragon)\/((\d+)?[\w\.]+)/i // Comodo Dragon
- ], [[NAME, /_/g, ' '], VERSION, MAJOR], [
-
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?((\d+)?[\w\.]+)/i
- // Chrome/OmniWeb/Arora/Tizen/Nokia
- ], [NAME, VERSION, MAJOR], [
-
- /(dolfin)\/((\d+)?[\w\.]+)/i // Dolphin
- ], [[NAME, 'Dolphin'], VERSION, MAJOR], [
-
- /((?:android.+)crmo|crios)\/((\d+)?[\w\.]+)/i // Chrome for Android/iOS
- ], [[NAME, 'Chrome'], VERSION, MAJOR], [
-
- /((?:android.+))version\/((\d+)?[\w\.]+)\smobile\ssafari/i // Android Browser
- ], [[NAME, 'Android Browser'], VERSION, MAJOR], [
-
- /version\/((\d+)?[\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
- ], [VERSION, MAJOR, [NAME, 'Mobile Safari']], [
-
- /version\/((\d+)?[\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
- ], [VERSION, MAJOR, NAME], [
-
- /webkit.+?(mobile\s?safari|safari)((\/[\w\.]+))/i // Safari < 3.0
- ], [NAME, [MAJOR, mapper.str, maps.browser.oldsafari.major], [VERSION, mapper.str, maps.browser.oldsafari.version]], [
-
- /(konqueror)\/((\d+)?[\w\.]+)/i, // Konqueror
- /(webkit|khtml)\/((\d+)?[\w\.]+)/i
- ], [NAME, VERSION, MAJOR], [
-
- // Gecko based
- /(navigator|netscape)\/((\d+)?[\w\.-]+)/i // Netscape
- ], [[NAME, 'Netscape'], VERSION, MAJOR], [
- /(swiftfox)/i, // Swiftfox
- /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?((\d+)?[\w\.\+]+)/i,
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/((\d+)?[\w\.-]+)/i,
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
- /(mozilla)\/((\d+)?[\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
-
- // Other
- /(uc\s?browser|polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|qqbrowser)[\/\s]?((\d+)?[\w\.]+)/i,
- // UCBrowser/Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/QQBrowser
- /(links)\s\(((\d+)?[\w\.]+)/i, // Links
- /(gobrowser)\/?((\d+)?[\w\.]+)*/i, // GoBrowser
- /(ice\s?browser)\/v?((\d+)?[\w\._]+)/i, // ICE Browser
- /(mosaic)[\/\s]((\d+)?[\w\.]+)/i // Mosaic
- ], [NAME, VERSION, MAJOR]
- ],
-
- engine : [[
-
- /(presto)\/([\w\.]+)/i, // Presto
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
- /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
- /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
- ], [NAME, VERSION], [
-
- /rv\:([\w\.]+).*(gecko)/i // Gecko
- ], [VERSION, NAME]
- ],
-
- os : [[
-
- // Windows based
- /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
- /(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
- ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
- /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
- ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
-
- // Mobile/Embedded OS
- /\((bb)(10);/i // BlackBerry 10
- ], [[NAME, 'BlackBerry'], VERSION], [
- /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
- /(tizen)\/([\w\.]+)/i, // Tizen
- /(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego)[\/\s-]?([\w\.]+)*/i
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo
- ], [NAME, VERSION], [
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
- ], [[NAME, 'Symbian'], VERSION],[
- /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
- ], [[NAME, 'Firefox OS'], VERSION], [
-
- // Console
- /(nintendo|playstation)\s([wids3portablevu]+)/i, // Nintendo/Playstation
-
- // GNU/Linux based
- /(mint)[\/\s\(]?(\w+)*/i, // Mint
- /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i,
- // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
- // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk
- /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
- /(gnu)\s?([\w\.]+)*/i // GNU
- ], [NAME, VERSION], [
-
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
- ], [[NAME, 'Chromium OS'], VERSION],[
-
- // Solaris
- /(sunos)\s?([\w\.]+\d)*/i // Solaris
- ], [[NAME, 'Solaris'], VERSION], [
-
- // BSD based
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
- ], [NAME, VERSION],[
-
- /(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i // iOS
- ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
-
- /(mac\sos\sx)\s?([\w\s\.]+\w)*/i // Mac OS
- ], [NAME, [VERSION, /_/g, '.']], [
-
- // Other
- /(haiku)\s(\w+)/i, // Haiku
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
- /(macintosh|mac(?=_powerpc)|plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos)/i,
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS
- /(unix)\s?([\w\.]+)*/i // UNIX
- ], [NAME, VERSION]
- ]
- };
-
-
- /////////////////
- // Constructor
- ////////////////
-
-
- var UAParser = function (uastring) {
-
- var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
-
- this.getBrowser = function () {
- return mapper.rgx.apply(this, regexes.browser);
- };
- this.getEngine = function () {
- return mapper.rgx.apply(this, regexes.engine);
- };
- this.getOS = function () {
- return mapper.rgx.apply(this, regexes.os);
- };
- this.getResult = function() {
- return {
- ua : this.getUA(),
- browser : this.getBrowser(),
- engine : this.getEngine(),
- os : this.getOS()
- };
- };
- this.getUA = function () {
- return ua;
- };
- this.setUA = function (uastring) {
- ua = uastring;
- return this;
- };
- this.setUA(ua);
- };
-
- return new UAParser().getResult();
- })();
-
-
- function version_compare(v1, v2, operator) {
- // From: http://phpjs.org/functions
- // + original by: Philippe Jausions (http://pear.php.net/user/jausions)
- // + original by: Aidan Lister (http://aidanlister.com/)
- // + reimplemented by: Kankrelune (http://www.webfaktory.info/)
- // + improved by: Brett Zamir (http://brett-zamir.me)
- // + improved by: Scott Baker
- // + improved by: Theriault
- // * example 1: version_compare('8.2.5rc', '8.2.5a');
- // * returns 1: 1
- // * example 2: version_compare('8.2.50', '8.2.52', '<');
- // * returns 2: true
- // * example 3: version_compare('5.3.0-dev', '5.3.0');
- // * returns 3: -1
- // * example 4: version_compare('4.1.0.52','4.01.0.51');
- // * returns 4: 1
-
- // Important: compare must be initialized at 0.
- var i = 0,
- x = 0,
- compare = 0,
- // vm maps textual PHP versions to negatives so they're less than 0.
- // PHP currently defines these as CASE-SENSITIVE. It is important to
- // leave these as negatives so that they can come before numerical versions
- // and as if no letters were there to begin with.
- // (1alpha is < 1 and < 1.1 but > 1dev1)
- // If a non-numerical value can't be mapped to this table, it receives
- // -7 as its value.
- vm = {
- 'dev': -6,
- 'alpha': -5,
- 'a': -5,
- 'beta': -4,
- 'b': -4,
- 'RC': -3,
- 'rc': -3,
- '#': -2,
- 'p': 1,
- 'pl': 1
- },
- // This function will be called to prepare each version argument.
- // It replaces every _, -, and + with a dot.
- // It surrounds any nonsequence of numbers/dots with dots.
- // It replaces sequences of dots with a single dot.
- // version_compare('4..0', '4.0') == 0
- // Important: A string of 0 length needs to be converted into a value
- // even less than an unexisting value in vm (-7), hence [-8].
- // It's also important to not strip spaces because of this.
- // version_compare('', ' ') == 1
- prepVersion = function (v) {
- v = ('' + v).replace(/[_\-+]/g, '.');
- v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
- return (!v.length ? [-8] : v.split('.'));
- },
- // This converts a version component to a number.
- // Empty component becomes 0.
- // Non-numerical component becomes a negative number.
- // Numerical component becomes itself as an integer.
- numVersion = function (v) {
- return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
- };
-
- v1 = prepVersion(v1);
- v2 = prepVersion(v2);
- x = Math.max(v1.length, v2.length);
- for (i = 0; i < x; i++) {
- if (v1[i] == v2[i]) {
- continue;
- }
- v1[i] = numVersion(v1[i]);
- v2[i] = numVersion(v2[i]);
- if (v1[i] < v2[i]) {
- compare = -1;
- break;
- } else if (v1[i] > v2[i]) {
- compare = 1;
- break;
- }
- }
- if (!operator) {
- return compare;
- }
-
- // Important: operator is CASE-SENSITIVE.
- // "No operator" seems to be treated as "<."
- // Any other values seem to make the function return null.
- switch (operator) {
- case '>':
- case 'gt':
- return (compare > 0);
- case '>=':
- case 'ge':
- return (compare >= 0);
- case '<=':
- case 'le':
- return (compare <= 0);
- case '==':
- case '=':
- case 'eq':
- return (compare === 0);
- case '<>':
- case '!=':
- case 'ne':
- return (compare !== 0);
- case '':
- case '<':
- case 'lt':
- return (compare < 0);
- default:
- return null;
- }
- }
-
-
- var can = (function() {
- var caps = {
- define_property: (function() {
- /* // currently too much extra code required, not exactly worth it
- try { // as of IE8, getters/setters are supported only on DOM elements
- var obj = {};
- if (Object.defineProperty) {
- Object.defineProperty(obj, 'prop', {
- enumerable: true,
- configurable: true
- });
- return true;
- }
- } catch(ex) {}
-
- if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) {
- return true;
- }*/
- return false;
- }()),
-
- create_canvas: (function() {
- // On the S60 and BB Storm, getContext exists, but always returns undefined
- // so we actually have to call getContext() to verify
- // github.com/Modernizr/Modernizr/issues/issue/97/
- var el = document.createElement('canvas');
- return !!(el.getContext && el.getContext('2d'));
- }()),
-
- return_response_type: function(responseType) {
- try {
- if (Basic.inArray(responseType, ['', 'text', 'document']) !== -1) {
- return true;
- } else if (window.XMLHttpRequest) {
- var xhr = new XMLHttpRequest();
- xhr.open('get', '/'); // otherwise Gecko throws an exception
- if ('responseType' in xhr) {
- xhr.responseType = responseType;
- // as of 23.0.1271.64, Chrome switched from throwing exception to merely logging it to the console (why? o why?)
- if (xhr.responseType !== responseType) {
- return false;
- }
- return true;
- }
- }
- } catch (ex) {}
- return false;
- },
-
- // ideas for this heavily come from Modernizr (http://modernizr.com/)
- use_data_uri: (function() {
- var du = new Image();
-
- du.onload = function() {
- caps.use_data_uri = (du.width === 1 && du.height === 1);
- };
-
- setTimeout(function() {
- du.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
- }, 1);
- return false;
- }()),
-
- use_data_uri_over32kb: function() { // IE8
- return caps.use_data_uri && (Env.browser !== 'IE' || Env.version >= 9);
- },
-
- use_data_uri_of: function(bytes) {
- return (caps.use_data_uri && bytes < 33000 || caps.use_data_uri_over32kb());
- },
-
- use_fileinput: function() {
- var el = document.createElement('input');
- el.setAttribute('type', 'file');
- return !el.disabled;
- }
- };
-
- return function(cap) {
- var args = [].slice.call(arguments);
- args.shift(); // shift of cap
- return Basic.typeOf(caps[cap]) === 'function' ? caps[cap].apply(this, args) : !!caps[cap];
- };
- }());
-
-
- var Env = {
- can: can,
-
- browser: UAParser.browser.name,
- version: parseFloat(UAParser.browser.major),
- os: UAParser.os.name, // everybody intuitively types it in a lowercase for some reason
- osVersion: UAParser.os.version,
-
- verComp: version_compare,
-
- swf_url: "../flash/Moxie.swf",
- xap_url: "../silverlight/Moxie.xap",
- global_event_dispatcher: "moxie.core.EventTarget.instance.dispatchEvent"
- };
-
- // for backward compatibility
- // @deprecated Use `Env.os` instead
- Env.OS = Env.os;
-
- return Env;
-});
-
-// Included from: src/javascript/core/utils/Dom.js
-
-/**
- * Dom.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Dom', ['moxie/core/utils/Env'], function(Env) {
-
- /**
- Get DOM Element by it's id.
-
- @method get
- @for Utils
- @param {String} id Identifier of the DOM Element
- @return {DOMElement}
- */
- var get = function(id) {
- if (typeof id !== 'string') {
- return id;
- }
- return document.getElementById(id);
- };
-
- /**
- Checks if specified DOM element has specified class.
-
- @method hasClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var hasClass = function(obj, name) {
- if (!obj.className) {
- return false;
- }
-
- var regExp = new RegExp("(^|\\s+)"+name+"(\\s+|$)");
- return regExp.test(obj.className);
- };
-
- /**
- Adds specified className to specified DOM element.
-
- @method addClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var addClass = function(obj, name) {
- if (!hasClass(obj, name)) {
- obj.className = !obj.className ? name : obj.className.replace(/\s+$/, '') + ' ' + name;
- }
- };
-
- /**
- Removes specified className from specified DOM element.
-
- @method removeClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var removeClass = function(obj, name) {
- if (obj.className) {
- var regExp = new RegExp("(^|\\s+)"+name+"(\\s+|$)");
- obj.className = obj.className.replace(regExp, function($0, $1, $2) {
- return $1 === ' ' && $2 === ' ' ? ' ' : '';
- });
- }
- };
-
- /**
- Returns a given computed style of a DOM element.
-
- @method getStyle
- @static
- @param {Object} obj DOM element like object.
- @param {String} name Style you want to get from the DOM element
- */
- var getStyle = function(obj, name) {
- if (obj.currentStyle) {
- return obj.currentStyle[name];
- } else if (window.getComputedStyle) {
- return window.getComputedStyle(obj, null)[name];
- }
- };
-
-
- /**
- Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
-
- @method getPos
- @static
- @param {Element} node HTML element or element id to get x, y position from.
- @param {Element} root Optional root element to stop calculations at.
- @return {object} Absolute position of the specified element object with x, y fields.
- */
- var getPos = function(node, root) {
- var x = 0, y = 0, parent, doc = document, nodeRect, rootRect;
-
- node = node;
- root = root || doc.body;
-
- // Returns the x, y cordinate for an element on IE 6 and IE 7
- function getIEPos(node) {
- var bodyElm, rect, x = 0, y = 0;
-
- if (node) {
- rect = node.getBoundingClientRect();
- bodyElm = doc.compatMode === "CSS1Compat" ? doc.documentElement : doc.body;
- x = rect.left + bodyElm.scrollLeft;
- y = rect.top + bodyElm.scrollTop;
- }
-
- return {
- x : x,
- y : y
- };
- }
-
- // Use getBoundingClientRect on IE 6 and IE 7 but not on IE 8 in standards mode
- if (node && node.getBoundingClientRect && Env.browser === 'IE' && (!doc.documentMode || doc.documentMode < 8)) {
- nodeRect = getIEPos(node);
- rootRect = getIEPos(root);
-
- return {
- x : nodeRect.x - rootRect.x,
- y : nodeRect.y - rootRect.y
- };
- }
-
- parent = node;
- while (parent && parent != root && parent.nodeType) {
- x += parent.offsetLeft || 0;
- y += parent.offsetTop || 0;
- parent = parent.offsetParent;
- }
-
- parent = node.parentNode;
- while (parent && parent != root && parent.nodeType) {
- x -= parent.scrollLeft || 0;
- y -= parent.scrollTop || 0;
- parent = parent.parentNode;
- }
-
- return {
- x : x,
- y : y
- };
- };
-
- /**
- Returns the size of the specified node in pixels.
-
- @method getSize
- @static
- @param {Node} node Node to get the size of.
- @return {Object} Object with a w and h property.
- */
- var getSize = function(node) {
- return {
- w : node.offsetWidth || node.clientWidth,
- h : node.offsetHeight || node.clientHeight
- };
- };
-
- return {
- get: get,
- hasClass: hasClass,
- addClass: addClass,
- removeClass: removeClass,
- getStyle: getStyle,
- getPos: getPos,
- getSize: getSize
- };
-});
-
-// Included from: src/javascript/core/Exceptions.js
-
-/**
- * Exceptions.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/Exceptions', [
- 'moxie/core/utils/Basic'
-], function(Basic) {
- function _findKey(obj, value) {
- var key;
- for (key in obj) {
- if (obj[key] === value) {
- return key;
- }
- }
- return null;
- }
-
- return {
- RuntimeError: (function() {
- var namecodes = {
- NOT_INIT_ERR: 1,
- NOT_SUPPORTED_ERR: 9,
- JS_ERR: 4
- };
-
- function RuntimeError(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": RuntimeError " + this.code;
- }
-
- Basic.extend(RuntimeError, namecodes);
- RuntimeError.prototype = Error.prototype;
- return RuntimeError;
- }()),
-
- OperationNotAllowedException: (function() {
-
- function OperationNotAllowedException(code) {
- this.code = code;
- this.name = 'OperationNotAllowedException';
- }
-
- Basic.extend(OperationNotAllowedException, {
- NOT_ALLOWED_ERR: 1
- });
-
- OperationNotAllowedException.prototype = Error.prototype;
-
- return OperationNotAllowedException;
- }()),
-
- ImageError: (function() {
- var namecodes = {
- WRONG_FORMAT: 1,
- MAX_RESOLUTION_ERR: 2
- };
-
- function ImageError(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": ImageError " + this.code;
- }
-
- Basic.extend(ImageError, namecodes);
- ImageError.prototype = Error.prototype;
-
- return ImageError;
- }()),
-
- FileException: (function() {
- var namecodes = {
- NOT_FOUND_ERR: 1,
- SECURITY_ERR: 2,
- ABORT_ERR: 3,
- NOT_READABLE_ERR: 4,
- ENCODING_ERR: 5,
- NO_MODIFICATION_ALLOWED_ERR: 6,
- INVALID_STATE_ERR: 7,
- SYNTAX_ERR: 8
- };
-
- function FileException(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": FileException " + this.code;
- }
-
- Basic.extend(FileException, namecodes);
- FileException.prototype = Error.prototype;
- return FileException;
- }()),
-
- DOMException: (function() {
- var namecodes = {
- INDEX_SIZE_ERR: 1,
- DOMSTRING_SIZE_ERR: 2,
- HIERARCHY_REQUEST_ERR: 3,
- WRONG_DOCUMENT_ERR: 4,
- INVALID_CHARACTER_ERR: 5,
- NO_DATA_ALLOWED_ERR: 6,
- NO_MODIFICATION_ALLOWED_ERR: 7,
- NOT_FOUND_ERR: 8,
- NOT_SUPPORTED_ERR: 9,
- INUSE_ATTRIBUTE_ERR: 10,
- INVALID_STATE_ERR: 11,
- SYNTAX_ERR: 12,
- INVALID_MODIFICATION_ERR: 13,
- NAMESPACE_ERR: 14,
- INVALID_ACCESS_ERR: 15,
- VALIDATION_ERR: 16,
- TYPE_MISMATCH_ERR: 17,
- SECURITY_ERR: 18,
- NETWORK_ERR: 19,
- ABORT_ERR: 20,
- URL_MISMATCH_ERR: 21,
- QUOTA_EXCEEDED_ERR: 22,
- TIMEOUT_ERR: 23,
- INVALID_NODE_TYPE_ERR: 24,
- DATA_CLONE_ERR: 25
- };
-
- function DOMException(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": DOMException " + this.code;
- }
-
- Basic.extend(DOMException, namecodes);
- DOMException.prototype = Error.prototype;
- return DOMException;
- }()),
-
- EventException: (function() {
- function EventException(code) {
- this.code = code;
- this.name = 'EventException';
- }
-
- Basic.extend(EventException, {
- UNSPECIFIED_EVENT_TYPE_ERR: 0
- });
-
- EventException.prototype = Error.prototype;
-
- return EventException;
- }())
- };
-});
-
-// Included from: src/javascript/core/EventTarget.js
-
-/**
- * EventTarget.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/EventTarget', [
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic'
-], function(x, Basic) {
- /**
- Parent object for all event dispatching components and objects
-
- @class EventTarget
- @constructor EventTarget
- */
- function EventTarget() {
- // hash of event listeners by object uid
- var eventpool = {};
-
- Basic.extend(this, {
-
- /**
- Unique id of the event dispatcher, usually overriden by children
-
- @property uid
- @type String
- */
- uid: null,
-
- /**
- Can be called from within a child in order to acquire uniqie id in automated manner
-
- @method init
- */
- init: function() {
- if (!this.uid) {
- this.uid = Basic.guid('uid_');
- }
- },
-
- /**
- Register a handler to a specific event dispatched by the object
-
- @method addEventListener
- @param {String} type Type or basically a name of the event to subscribe to
- @param {Function} fn Callback function that will be called when event happens
- @param {Number} [priority=0] Priority of the event handler - handlers with higher priorities will be called first
- @param {Object} [scope=this] A scope to invoke event handler in
- */
- addEventListener: function(type, fn, priority, scope) {
- var self = this, list;
-
- type = Basic.trim(type);
-
- if (/\s/.test(type)) {
- // multiple event types were passed for one handler
- Basic.each(type.split(/\s+/), function(type) {
- self.addEventListener(type, fn, priority, scope);
- });
- return;
- }
-
- type = type.toLowerCase();
- priority = parseInt(priority, 10) || 0;
-
- list = eventpool[this.uid] && eventpool[this.uid][type] || [];
- list.push({fn : fn, priority : priority, scope : scope || this});
-
- if (!eventpool[this.uid]) {
- eventpool[this.uid] = {};
- }
- eventpool[this.uid][type] = list;
- },
-
- /**
- Check if any handlers were registered to the specified event
-
- @method hasEventListener
- @param {String} type Type or basically a name of the event to check
- @return {Mixed} Returns a handler if it was found and false, if - not
- */
- hasEventListener: function(type) {
- return type ? !!(eventpool[this.uid] && eventpool[this.uid][type]) : !!eventpool[this.uid];
- },
-
- /**
- Unregister the handler from the event, or if former was not specified - unregister all handlers
-
- @method removeEventListener
- @param {String} type Type or basically a name of the event
- @param {Function} [fn] Handler to unregister
- */
- removeEventListener: function(type, fn) {
- type = type.toLowerCase();
-
- var list = eventpool[this.uid] && eventpool[this.uid][type], i;
-
- if (list) {
- if (fn) {
- for (i = list.length - 1; i >= 0; i--) {
- if (list[i].fn === fn) {
- list.splice(i, 1);
- break;
- }
- }
- } else {
- list = [];
- }
-
- // delete event list if it has become empty
- if (!list.length) {
- delete eventpool[this.uid][type];
-
- // and object specific entry in a hash if it has no more listeners attached
- if (Basic.isEmptyObj(eventpool[this.uid])) {
- delete eventpool[this.uid];
- }
- }
- }
- },
-
- /**
- Remove all event handlers from the object
-
- @method removeAllEventListeners
- */
- removeAllEventListeners: function() {
- if (eventpool[this.uid]) {
- delete eventpool[this.uid];
- }
- },
-
- /**
- Dispatch the event
-
- @method dispatchEvent
- @param {String/Object} Type of event or event object to dispatch
- @param {Mixed} [...] Variable number of arguments to be passed to a handlers
- @return {Boolean} true by default and false if any handler returned false
- */
- dispatchEvent: function(type) {
- var uid, list, args, tmpEvt, evt = {}, result = true, undef;
-
- if (Basic.typeOf(type) !== 'string') {
- // we can't use original object directly (because of Silverlight)
- tmpEvt = type;
-
- if (Basic.typeOf(tmpEvt.type) === 'string') {
- type = tmpEvt.type;
-
- if (tmpEvt.total !== undef && tmpEvt.loaded !== undef) { // progress event
- evt.total = tmpEvt.total;
- evt.loaded = tmpEvt.loaded;
- }
- evt.async = tmpEvt.async || false;
- } else {
- throw new x.EventException(x.EventException.UNSPECIFIED_EVENT_TYPE_ERR);
- }
- }
-
- // check if event is meant to be dispatched on an object having specific uid
- if (type.indexOf('::') !== -1) {
- (function(arr) {
- uid = arr[0];
- type = arr[1];
- }(type.split('::')));
- } else {
- uid = this.uid;
- }
-
- type = type.toLowerCase();
-
- list = eventpool[uid] && eventpool[uid][type];
-
- if (list) {
- // sort event list by prority
- list.sort(function(a, b) { return b.priority - a.priority; });
-
- args = [].slice.call(arguments);
-
- // first argument will be pseudo-event object
- args.shift();
- evt.type = type;
- args.unshift(evt);
-
- // Dispatch event to all listeners
- var queue = [];
- Basic.each(list, function(handler) {
- // explicitly set the target, otherwise events fired from shims do not get it
- args[0].target = handler.scope;
- // if event is marked as async, detach the handler
- if (evt.async) {
- queue.push(function(cb) {
- setTimeout(function() {
- cb(handler.fn.apply(handler.scope, args) === false);
- }, 1);
- });
- } else {
- queue.push(function(cb) {
- cb(handler.fn.apply(handler.scope, args) === false); // if handler returns false stop propagation
- });
- }
- });
- if (queue.length) {
- Basic.inSeries(queue, function(err) {
- result = !err;
- });
- }
- }
- return result;
- },
-
- /**
- Alias for addEventListener
-
- @method bind
- @protected
- */
- bind: function() {
- this.addEventListener.apply(this, arguments);
- },
-
- /**
- Alias for removeEventListener
-
- @method unbind
- @protected
- */
- unbind: function() {
- this.removeEventListener.apply(this, arguments);
- },
-
- /**
- Alias for removeAllEventListeners
-
- @method unbindAll
- @protected
- */
- unbindAll: function() {
- this.removeAllEventListeners.apply(this, arguments);
- },
-
- /**
- Alias for dispatchEvent
-
- @method trigger
- @protected
- */
- trigger: function() {
- return this.dispatchEvent.apply(this, arguments);
- },
-
-
- /**
- Converts properties of on[event] type to corresponding event handlers,
- is used to avoid extra hassle around the process of calling them back
-
- @method convertEventPropsToHandlers
- @private
- */
- convertEventPropsToHandlers: function(handlers) {
- var h;
-
- if (Basic.typeOf(handlers) !== 'array') {
- handlers = [handlers];
- }
-
- for (var i = 0; i < handlers.length; i++) {
- h = 'on' + handlers[i];
-
- if (Basic.typeOf(this[h]) === 'function') {
- this.addEventListener(handlers[i], this[h]);
- } else if (Basic.typeOf(this[h]) === 'undefined') {
- this[h] = null; // object must have defined event properties, even if it doesn't make use of them
- }
- }
- }
-
- });
- }
-
- EventTarget.instance = new EventTarget();
-
- return EventTarget;
-});
-
-// Included from: src/javascript/core/utils/Encode.js
-
-/**
- * Encode.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Encode', [], function() {
-
- /**
- Encode string with UTF-8
-
- @method utf8_encode
- @for Utils
- @static
- @param {String} str String to encode
- @return {String} UTF-8 encoded string
- */
- var utf8_encode = function(str) {
- return unescape(encodeURIComponent(str));
- };
-
- /**
- Decode UTF-8 encoded string
-
- @method utf8_decode
- @static
- @param {String} str String to decode
- @return {String} Decoded string
- */
- var utf8_decode = function(str_data) {
- return decodeURIComponent(escape(str_data));
- };
-
- /**
- Decode Base64 encoded string (uses browser's default method if available),
- from: https://raw.github.com/kvz/phpjs/master/functions/url/base64_decode.js
-
- @method atob
- @static
- @param {String} data String to decode
- @return {String} Decoded string
- */
- var atob = function(data, utf8) {
- if (typeof(window.atob) === 'function') {
- return utf8 ? utf8_decode(window.atob(data)) : window.atob(data);
- }
-
- // http://kevin.vanzonneveld.net
- // + original by: Tyler Akins (http://rumkin.com)
- // + improved by: Thunder.m
- // + input by: Aman Gupta
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Onno Marsman
- // + bugfixed by: Pellentesque Malesuada
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + input by: Brett Zamir (http://brett-zamir.me)
- // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
- // * returns 1: 'Kevin van Zonneveld'
- // mozilla has this native
- // - but breaks in 2.0.0.12!
- //if (typeof this.window.atob == 'function') {
- // return atob(data);
- //}
- var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
- ac = 0,
- dec = "",
- tmp_arr = [];
-
- if (!data) {
- return data;
- }
-
- data += '';
-
- do { // unpack four hexets into three octets using index points in b64
- h1 = b64.indexOf(data.charAt(i++));
- h2 = b64.indexOf(data.charAt(i++));
- h3 = b64.indexOf(data.charAt(i++));
- h4 = b64.indexOf(data.charAt(i++));
-
- bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
-
- o1 = bits >> 16 & 0xff;
- o2 = bits >> 8 & 0xff;
- o3 = bits & 0xff;
-
- if (h3 == 64) {
- tmp_arr[ac++] = String.fromCharCode(o1);
- } else if (h4 == 64) {
- tmp_arr[ac++] = String.fromCharCode(o1, o2);
- } else {
- tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
- }
- } while (i < data.length);
-
- dec = tmp_arr.join('');
-
- return utf8 ? utf8_decode(dec) : dec;
- };
-
- /**
- Base64 encode string (uses browser's default method if available),
- from: https://raw.github.com/kvz/phpjs/master/functions/url/base64_encode.js
-
- @method btoa
- @static
- @param {String} data String to encode
- @return {String} Base64 encoded string
- */
- var btoa = function(data, utf8) {
- if (utf8) {
- utf8_encode(data);
- }
-
- if (typeof(window.btoa) === 'function') {
- return window.btoa(data);
- }
-
- // http://kevin.vanzonneveld.net
- // + original by: Tyler Akins (http://rumkin.com)
- // + improved by: Bayron Guevara
- // + improved by: Thunder.m
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Pellentesque Malesuada
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + improved by: Rafał Kukawski (http://kukawski.pl)
- // * example 1: base64_encode('Kevin van Zonneveld');
- // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
- // mozilla has this native
- // - but breaks in 2.0.0.12!
- var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
- ac = 0,
- enc = "",
- tmp_arr = [];
-
- if (!data) {
- return data;
- }
-
- do { // pack three octets into four hexets
- o1 = data.charCodeAt(i++);
- o2 = data.charCodeAt(i++);
- o3 = data.charCodeAt(i++);
-
- bits = o1 << 16 | o2 << 8 | o3;
-
- h1 = bits >> 18 & 0x3f;
- h2 = bits >> 12 & 0x3f;
- h3 = bits >> 6 & 0x3f;
- h4 = bits & 0x3f;
-
- // use hexets to index into b64, and append result to encoded string
- tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
- } while (i < data.length);
-
- enc = tmp_arr.join('');
-
- var r = data.length % 3;
-
- return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
- };
-
-
- return {
- utf8_encode: utf8_encode,
- utf8_decode: utf8_decode,
- atob: atob,
- btoa: btoa
- };
-});
-
-// Included from: src/javascript/runtime/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/Runtime', [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/EventTarget"
-], function(Basic, Dom, EventTarget) {
- var runtimeConstructors = {}, runtimes = {};
-
- /**
- Common set of methods and properties for every runtime instance
-
- @class Runtime
-
- @param {Object} options
- @param {String} type Sanitized name of the runtime
- @param {Object} [caps] Set of capabilities that differentiate specified runtime
- @param {Object} [modeCaps] Set of capabilities that do require specific operational mode
- @param {String} [preferredMode='browser'] Preferred operational mode to choose if no required capabilities were requested
- */
- function Runtime(options, type, caps, modeCaps, preferredMode) {
- /**
- Dispatched when runtime is initialized and ready.
- Results in RuntimeInit on a connected component.
-
- @event Init
- */
-
- /**
- Dispatched when runtime fails to initialize.
- Results in RuntimeError on a connected component.
-
- @event Error
- */
-
- var self = this
- , _shim
- , _uid = Basic.guid(type + '_')
- , defaultMode = preferredMode || 'browser'
- ;
-
- options = options || {};
-
- // register runtime in private hash
- runtimes[_uid] = this;
-
- /**
- Default set of capabilities, which can be redifined later by specific runtime
-
- @private
- @property caps
- @type Object
- */
- caps = Basic.extend({
- // Runtime can:
- // provide access to raw binary data of the file
- access_binary: false,
- // provide access to raw binary data of the image (image extension is optional)
- access_image_binary: false,
- // display binary data as thumbs for example
- display_media: false,
- // make cross-domain requests
- do_cors: false,
- // accept files dragged and dropped from the desktop
- drag_and_drop: false,
- // filter files in selection dialog by their extensions
- filter_by_extension: true,
- // resize image (and manipulate it raw data of any file in general)
- resize_image: false,
- // periodically report how many bytes of total in the file were uploaded (loaded)
- report_upload_progress: false,
- // provide access to the headers of http response
- return_response_headers: false,
- // support response of specific type, which should be passed as an argument
- // e.g. runtime.can('return_response_type', 'blob')
- return_response_type: false,
- // return http status code of the response
- return_status_code: true,
- // send custom http header with the request
- send_custom_headers: false,
- // pick up the files from a dialog
- select_file: false,
- // select whole folder in file browse dialog
- select_folder: false,
- // select multiple files at once in file browse dialog
- select_multiple: true,
- // send raw binary data, that is generated after image resizing or manipulation of other kind
- send_binary_string: false,
- // send cookies with http request and therefore retain session
- send_browser_cookies: true,
- // send data formatted as multipart/form-data
- send_multipart: true,
- // slice the file or blob to smaller parts
- slice_blob: false,
- // upload file without preloading it to memory, stream it out directly from disk
- stream_upload: false,
- // programmatically trigger file browse dialog
- summon_file_dialog: false,
- // upload file of specific size, size should be passed as argument
- // e.g. runtime.can('upload_filesize', '500mb')
- upload_filesize: true,
- // initiate http request with specific http method, method should be passed as argument
- // e.g. runtime.can('use_http_method', 'put')
- use_http_method: true
- }, caps);
-
-
- // default to the mode that is compatible with preferred caps
- if (options.preferred_caps) {
- defaultMode = Runtime.getMode(modeCaps, options.preferred_caps, defaultMode);
- }
-
- // small extension factory here (is meant to be extended with actual extensions constructors)
- _shim = (function() {
- var objpool = {};
- return {
- exec: function(uid, comp, fn, args) {
- if (_shim[comp]) {
- if (!objpool[uid]) {
- objpool[uid] = {
- context: this,
- instance: new _shim[comp]()
- };
- }
- if (objpool[uid].instance[fn]) {
- return objpool[uid].instance[fn].apply(this, args);
- }
- }
- },
-
- removeInstance: function(uid) {
- delete objpool[uid];
- },
-
- removeAllInstances: function() {
- var self = this;
- Basic.each(objpool, function(obj, uid) {
- if (Basic.typeOf(obj.instance.destroy) === 'function') {
- obj.instance.destroy.call(obj.context);
- }
- self.removeInstance(uid);
- });
- }
- };
- }());
-
-
- // public methods
- Basic.extend(this, {
- /**
- Specifies whether runtime instance was initialized or not
-
- @property initialized
- @type {Boolean}
- @default false
- */
- initialized: false, // shims require this flag to stop initialization retries
-
- /**
- Unique ID of the runtime
-
- @property uid
- @type {String}
- */
- uid: _uid,
-
- /**
- Runtime type (e.g. flash, html5, etc)
-
- @property type
- @type {String}
- */
- type: type,
-
- /**
- Runtime (not native one) may operate in browser or client mode.
-
- @property mode
- @private
- @type {String|Boolean} current mode or false, if none possible
- */
- mode: Runtime.getMode(modeCaps, (options.required_caps), defaultMode),
-
- /**
- id of the DOM container for the runtime (if available)
-
- @property shimid
- @type {String}
- */
- shimid: _uid + '_container',
-
- /**
- Number of connected clients. If equal to zero, runtime can be destroyed
-
- @property clients
- @type {Number}
- */
- clients: 0,
-
- /**
- Runtime initialization options
-
- @property options
- @type {Object}
- */
- options: options,
-
- /**
- Checks if the runtime has specific capability
-
- @method can
- @param {String} cap Name of capability to check
- @param {Mixed} [value] If passed, capability should somehow correlate to the value
- @param {Object} [refCaps] Set of capabilities to check the specified cap against (defaults to internal set)
- @return {Boolean} true if runtime has such capability and false, if - not
- */
- can: function(cap, value) {
- var refCaps = arguments[2] || caps;
-
- // if cap var is a comma-separated list of caps, convert it to object (key/value)
- if (Basic.typeOf(cap) === 'string' && Basic.typeOf(value) === 'undefined') {
- cap = Runtime.parseCaps(cap);
- }
-
- if (Basic.typeOf(cap) === 'object') {
- for (var key in cap) {
- if (!this.can(key, cap[key], refCaps)) {
- return false;
- }
- }
- return true;
- }
-
- // check the individual cap
- if (Basic.typeOf(refCaps[cap]) === 'function') {
- return refCaps[cap].call(this, value);
- } else {
- return (value === refCaps[cap]);
- }
- },
-
- /**
- Returns container for the runtime as DOM element
-
- @method getShimContainer
- @return {DOMElement}
- */
- getShimContainer: function() {
- var container, shimContainer = Dom.get(this.shimid);
-
- // if no container for shim, create one
- if (!shimContainer) {
- container = this.options.container ? Dom.get(this.options.container) : document.body;
-
- // create shim container and insert it at an absolute position into the outer container
- shimContainer = document.createElement('div');
- shimContainer.id = this.shimid;
- shimContainer.className = 'moxie-shim moxie-shim-' + this.type;
-
- Basic.extend(shimContainer.style, {
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- container.appendChild(shimContainer);
- container = null;
- }
-
- return shimContainer;
- },
-
- /**
- Returns runtime as DOM element (if appropriate)
-
- @method getShim
- @return {DOMElement}
- */
- getShim: function() {
- return _shim;
- },
-
- /**
- Invokes a method within the runtime itself (might differ across the runtimes)
-
- @method shimExec
- @param {Mixed} []
- @protected
- @return {Mixed} Depends on the action and component
- */
- shimExec: function(component, action) {
- var args = [].slice.call(arguments, 2);
- return self.getShim().exec.call(this, this.uid, component, action, args);
- },
-
- /**
- Operaional interface that is used by components to invoke specific actions on the runtime
- (is invoked in the scope of component)
-
- @method exec
- @param {Mixed} []*
- @protected
- @return {Mixed} Depends on the action and component
- */
- exec: function(component, action) { // this is called in the context of component, not runtime
- var args = [].slice.call(arguments, 2);
-
- if (self[component] && self[component][action]) {
- return self[component][action].apply(this, args);
- }
- return self.shimExec.apply(this, arguments);
- },
-
- /**
- Destroys the runtime (removes all events and deletes DOM structures)
-
- @method destroy
- */
- destroy: function() {
- if (!self) {
- return; // obviously already destroyed
- }
-
- var shimContainer = Dom.get(this.shimid);
- if (shimContainer) {
- shimContainer.parentNode.removeChild(shimContainer);
- }
-
- if (_shim) {
- _shim.removeAllInstances();
- }
-
- this.unbindAll();
- delete runtimes[this.uid];
- this.uid = null; // mark this runtime as destroyed
- _uid = self = _shim = shimContainer = null;
- }
- });
-
- // once we got the mode, test against all caps
- if (this.mode && options.required_caps && !this.can(options.required_caps)) {
- this.mode = false;
- }
- }
-
-
- /**
- Default order to try different runtime types
-
- @property order
- @type String
- @static
- */
- Runtime.order = 'html5,flash,silverlight,html4';
-
-
- /**
- Retrieves runtime from private hash by it's uid
-
- @method getRuntime
- @private
- @static
- @param {String} uid Unique identifier of the runtime
- @return {Runtime|Boolean} Returns runtime, if it exists and false, if - not
- */
- Runtime.getRuntime = function(uid) {
- return runtimes[uid] ? runtimes[uid] : false;
- };
-
-
- /**
- Register constructor for the Runtime of new (or perhaps modified) type
-
- @method addConstructor
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @param {Function} construct Constructor for the Runtime type
- */
- Runtime.addConstructor = function(type, constructor) {
- constructor.prototype = EventTarget.instance;
- runtimeConstructors[type] = constructor;
- };
-
-
- /**
- Get the constructor for the specified type.
-
- method getConstructor
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @return {Function} Constructor for the Runtime type
- */
- Runtime.getConstructor = function(type) {
- return runtimeConstructors[type] || null;
- };
-
-
- /**
- Get info about the runtime (uid, type, capabilities)
-
- @method getInfo
- @static
- @param {String} uid Unique identifier of the runtime
- @return {Mixed} Info object or null if runtime doesn't exist
- */
- Runtime.getInfo = function(uid) {
- var runtime = Runtime.getRuntime(uid);
-
- if (runtime) {
- return {
- uid: runtime.uid,
- type: runtime.type,
- mode: runtime.mode,
- can: function() {
- return runtime.can.apply(runtime, arguments);
- }
- };
- }
- return null;
- };
-
-
- /**
- Convert caps represented by a comma-separated string to the object representation.
-
- @method parseCaps
- @static
- @param {String} capStr Comma-separated list of capabilities
- @return {Object}
- */
- Runtime.parseCaps = function(capStr) {
- var capObj = {};
-
- if (Basic.typeOf(capStr) !== 'string') {
- return capStr || {};
- }
-
- Basic.each(capStr.split(','), function(key) {
- capObj[key] = true; // we assume it to be - true
- });
-
- return capObj;
- };
-
- /**
- Test the specified runtime for specific capabilities.
-
- @method can
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @param {String|Object} caps Set of capabilities to check
- @return {Boolean} Result of the test
- */
- Runtime.can = function(type, caps) {
- var runtime
- , constructor = Runtime.getConstructor(type)
- , mode
- ;
- if (constructor) {
- runtime = new constructor({
- required_caps: caps
- });
- mode = runtime.mode;
- runtime.destroy();
- return !!mode;
- }
- return false;
- };
-
-
- /**
- Figure out a runtime that supports specified capabilities.
-
- @method thatCan
- @static
- @param {String|Object} caps Set of capabilities to check
- @param {String} [runtimeOrder] Comma-separated list of runtimes to check against
- @return {String} Usable runtime identifier or null
- */
- Runtime.thatCan = function(caps, runtimeOrder) {
- var types = (runtimeOrder || Runtime.order).split(/\s*,\s*/);
- for (var i in types) {
- if (Runtime.can(types[i], caps)) {
- return types[i];
- }
- }
- return null;
- };
-
-
- /**
- Figure out an operational mode for the specified set of capabilities.
-
- @method getMode
- @static
- @param {Object} modeCaps Set of capabilities that depend on particular runtime mode
- @param {Object} [requiredCaps] Supplied set of capabilities to find operational mode for
- @param {String|Boolean} [defaultMode='browser'] Default mode to use
- @return {String|Boolean} Compatible operational mode
- */
- Runtime.getMode = function(modeCaps, requiredCaps, defaultMode) {
- var mode = null;
-
- if (Basic.typeOf(defaultMode) === 'undefined') { // only if not specified
- defaultMode = 'browser';
- }
-
- if (requiredCaps && !Basic.isEmptyObj(modeCaps)) {
- // loop over required caps and check if they do require the same mode
- Basic.each(requiredCaps, function(value, cap) {
- if (modeCaps.hasOwnProperty(cap)) {
- var capMode = modeCaps[cap](value);
-
- // make sure we always have an array
- if (typeof(capMode) === 'string') {
- capMode = [capMode];
- }
-
- if (!mode) {
- mode = capMode;
- } else if (!(mode = Basic.arrayIntersect(mode, capMode))) {
- // if cap requires conflicting mode - runtime cannot fulfill required caps
- return (mode = false);
- }
- }
- });
-
- if (mode) {
- return Basic.inArray(defaultMode, mode) !== -1 ? defaultMode : mode[0];
- } else if (mode === false) {
- return false;
- }
- }
- return defaultMode;
- };
-
-
- /**
- Capability check that always returns true
-
- @private
- @static
- @return {True}
- */
- Runtime.capTrue = function() {
- return true;
- };
-
- /**
- Capability check that always returns false
-
- @private
- @static
- @return {False}
- */
- Runtime.capFalse = function() {
- return false;
- };
-
- /**
- Evaluate the expression to boolean value and create a function that always returns it.
-
- @private
- @static
- @param {Mixed} expr Expression to evaluate
- @return {Function} Function returning the result of evaluation
- */
- Runtime.capTest = function(expr) {
- return function() {
- return !!expr;
- };
- };
-
- return Runtime;
-});
-
-// Included from: src/javascript/runtime/RuntimeClient.js
-
-/**
- * RuntimeClient.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/RuntimeClient', [
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic',
- 'moxie/runtime/Runtime'
-], function(x, Basic, Runtime) {
- /**
- Set of methods and properties, required by a component to acquire ability to connect to a runtime
-
- @class RuntimeClient
- */
- return function RuntimeClient() {
- var runtime;
-
- Basic.extend(this, {
- /**
- Connects to the runtime specified by the options. Will either connect to existing runtime or create a new one.
- Increments number of clients connected to the specified runtime.
-
- @method connectRuntime
- @param {Mixed} options Can be a runtme uid or a set of key-value pairs defining requirements and pre-requisites
- */
- connectRuntime: function(options) {
- var comp = this, ruid;
-
- function initialize(items) {
- var type, constructor;
-
- // if we ran out of runtimes
- if (!items.length) {
- comp.trigger('RuntimeError', new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR));
- runtime = null;
- return;
- }
-
- type = items.shift();
- constructor = Runtime.getConstructor(type);
- if (!constructor) {
- initialize(items);
- return;
- }
-
- // try initializing the runtime
- runtime = new constructor(options);
-
- runtime.bind('Init', function() {
- // mark runtime as initialized
- runtime.initialized = true;
-
- // jailbreak ...
- setTimeout(function() {
- runtime.clients++;
- // this will be triggered on component
- comp.trigger('RuntimeInit', runtime);
- }, 1);
- });
-
- runtime.bind('Error', function() {
- runtime.destroy(); // runtime cannot destroy itself from inside at a right moment, thus we do it here
- initialize(items);
- });
-
- /*runtime.bind('Exception', function() { });*/
-
- // check if runtime managed to pick-up operational mode
- if (!runtime.mode) {
- runtime.trigger('Error');
- return;
- }
-
- runtime.init();
- }
-
- // check if a particular runtime was requested
- if (Basic.typeOf(options) === 'string') {
- ruid = options;
- } else if (Basic.typeOf(options.ruid) === 'string') {
- ruid = options.ruid;
- }
-
- if (ruid) {
- runtime = Runtime.getRuntime(ruid);
- if (runtime) {
- runtime.clients++;
- return runtime;
- } else {
- // there should be a runtime and there's none - weird case
- throw new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR);
- }
- }
-
- // initialize a fresh one, that fits runtime list and required features best
- initialize((options.runtime_order || Runtime.order).split(/\s*,\s*/));
- },
-
- /**
- Returns the runtime to which the client is currently connected.
-
- @method getRuntime
- @return {Runtime} Runtime or null if client is not connected
- */
- getRuntime: function() {
- if (runtime && runtime.uid) {
- return runtime;
- }
- runtime = null; // make sure we do not leave zombies rambling around
- return null;
- },
-
- /**
- Disconnects from the runtime. Decrements number of clients connected to the specified runtime.
-
- @method disconnectRuntime
- */
- disconnectRuntime: function() {
- if (runtime && --runtime.clients <= 0) {
- runtime.destroy();
- runtime = null;
- }
- }
-
- });
- };
-
-
-});
-
-// Included from: src/javascript/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/Blob', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Encode',
- 'moxie/runtime/RuntimeClient'
-], function(Basic, Encode, RuntimeClient) {
-
- var blobpool = {};
-
- /**
- @class Blob
- @constructor
- @param {String} ruid Unique id of the runtime, to which this blob belongs to
- @param {Object} blob Object "Native" blob object, as it is represented in the runtime
- */
- function Blob(ruid, blob) {
-
- function _sliceDetached(start, end, type) {
- var blob, data = blobpool[this.uid];
-
- if (Basic.typeOf(data) !== 'string' || !data.length) {
- return null; // or throw exception
- }
-
- blob = new Blob(null, {
- type: type,
- size: end - start
- });
- blob.detach(data.substr(start, blob.size));
-
- return blob;
- }
-
- RuntimeClient.call(this);
-
- if (ruid) {
- this.connectRuntime(ruid);
- }
-
- if (!blob) {
- blob = {};
- } else if (Basic.typeOf(blob) === 'string') { // dataUrl or binary string
- blob = { data: blob };
- }
-
- Basic.extend(this, {
-
- /**
- Unique id of the component
-
- @property uid
- @type {String}
- */
- uid: blob.uid || Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if falsy, then runtime will have to be initialized
- before this Blob can be used, modified or sent
-
- @property ruid
- @type {String}
- */
- ruid: ruid,
-
- /**
- Size of blob
-
- @property size
- @type {Number}
- @default 0
- */
- size: blob.size || 0,
-
- /**
- Mime type of blob
-
- @property type
- @type {String}
- @default ''
- */
- type: blob.type || '',
-
- /**
- @method slice
- @param {Number} [start=0]
- */
- slice: function(start, end, type) {
- if (this.isDetached()) {
- return _sliceDetached.apply(this, arguments);
- }
- return this.getRuntime().exec.call(this, 'Blob', 'slice', this.getSource(), start, end, type);
- },
-
- /**
- Returns "native" blob object (as it is represented in connected runtime) or null if not found
-
- @method getSource
- @return {Blob} Returns "native" blob object or null if not found
- */
- getSource: function() {
- if (!blobpool[this.uid]) {
- return null;
- }
- return blobpool[this.uid];
- },
-
- /**
- Detaches blob from any runtime that it depends on and initialize with standalone value
-
- @method detach
- @protected
- @param {DOMString} [data=''] Standalone value
- */
- detach: function(data) {
- if (this.ruid) {
- this.getRuntime().exec.call(this, 'Blob', 'destroy', blobpool[this.uid]);
- this.disconnectRuntime();
- this.ruid = null;
- }
-
- data = data || '';
-
- // if dataUrl, convert to binary string
- var matches = data.match(/^data:([^;]*);base64,/);
- if (matches) {
- this.type = matches[1];
- data = Encode.atob(data.substring(data.indexOf('base64,') + 7));
- }
-
- this.size = data.length;
-
- blobpool[this.uid] = data;
- },
-
- /**
- Checks if blob is standalone (detached of any runtime)
-
- @method isDetached
- @protected
- @return {Boolean}
- */
- isDetached: function() {
- return !this.ruid && Basic.typeOf(blobpool[this.uid]) === 'string';
- },
-
- /**
- Destroy Blob and free any resources it was using
-
- @method destroy
- */
- destroy: function() {
- this.detach();
- delete blobpool[this.uid];
- }
- });
-
-
- if (blob.data) {
- this.detach(blob.data); // auto-detach if payload has been passed
- } else {
- blobpool[this.uid] = blob;
- }
- }
-
- return Blob;
-});
-
-// Included from: src/javascript/file/File.js
-
-/**
- * File.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/File', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Mime',
- 'moxie/file/Blob'
-], function(Basic, Mime, Blob) {
- /**
- @class File
- @extends Blob
- @constructor
- @param {String} ruid Unique id of the runtime, to which this blob belongs to
- @param {Object} file Object "Native" file object, as it is represented in the runtime
- */
- function File(ruid, file) {
- var name, type;
-
- if (!file) { // avoid extra errors in case we overlooked something
- file = {};
- }
-
- // figure out the type
- if (file.type && file.type !== '') {
- type = file.type;
- } else {
- type = Mime.getFileMime(file.name);
- }
-
- // sanitize file name or generate new one
- if (file.name) {
- name = file.name.replace(/\\/g, '/');
- name = name.substr(name.lastIndexOf('/') + 1);
- } else {
- var prefix = type.split('/')[0];
- name = Basic.guid((prefix !== '' ? prefix : 'file') + '_');
-
- if (Mime.extensions[type]) {
- name += '.' + Mime.extensions[type][0]; // append proper extension if possible
- }
- }
-
- Blob.apply(this, arguments);
-
- Basic.extend(this, {
- /**
- File mime type
-
- @property type
- @type {String}
- @default ''
- */
- type: type || '',
-
- /**
- File name
-
- @property name
- @type {String}
- @default UID
- */
- name: name || Basic.guid('file_'),
-
- /**
- Date of last modification
-
- @property lastModifiedDate
- @type {String}
- @default now
- */
- lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString() // Thu Aug 23 2012 19:40:00 GMT+0400 (GET)
- });
- }
-
- File.prototype = Blob.prototype;
-
- return File;
-});
-
-// Included from: src/javascript/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileInput', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Mime',
- 'moxie/core/utils/Dom',
- 'moxie/core/Exceptions',
- 'moxie/core/EventTarget',
- 'moxie/core/I18n',
- 'moxie/file/File',
- 'moxie/runtime/Runtime',
- 'moxie/runtime/RuntimeClient'
-], function(Basic, Mime, Dom, x, EventTarget, I18n, File, Runtime, RuntimeClient) {
- /**
- Provides a convenient way to create cross-browser file-picker. Generates file selection dialog on click,
- converts selected files to _File_ objects, to be used in conjunction with _Image_, preloaded in memory
- with _FileReader_ or uploaded to a server through _XMLHttpRequest_.
-
- @class FileInput
- @constructor
- @extends EventTarget
- @uses RuntimeClient
- @param {Object|String|DOMElement} options If options is string or node, argument is considered as _browse\_button_.
- @param {String|DOMElement} options.browse_button DOM Element to turn into file picker.
- @param {Array} [options.accept] Array of mime types to accept. By default accepts all.
- @param {String} [options.file='file'] Name of the file field (not the filename).
- @param {Boolean} [options.multiple=false] Enable selection of multiple files.
- @param {Boolean} [options.directory=false] Turn file input into the folder input (cannot be both at the same time).
- @param {String|DOMElement} [options.container] DOM Element to use as a container for file-picker. Defaults to parentNode
- for _browse\_button_.
- @param {Object|String} [options.required_caps] Set of required capabilities, that chosen runtime must support.
-
- @example
-
-
-
- */
- var dispatches = [
- /**
- Dispatched when runtime is connected and file-picker is ready to be used.
-
- @event ready
- @param {Object} event
- */
- 'ready',
-
- /**
- Dispatched right after [ready](#event_ready) event, and whenever [refresh()](#method_refresh) is invoked.
- Check [corresponding documentation entry](#method_refresh) for more info.
-
- @event refresh
- @param {Object} event
- */
-
- /**
- Dispatched when selection of files in the dialog is complete.
-
- @event change
- @param {Object} event
- */
- 'change',
-
- 'cancel', // TODO: might be useful
-
- /**
- Dispatched when mouse cursor enters file-picker area. Can be used to style element
- accordingly.
-
- @event mouseenter
- @param {Object} event
- */
- 'mouseenter',
-
- /**
- Dispatched when mouse cursor leaves file-picker area. Can be used to style element
- accordingly.
-
- @event mouseleave
- @param {Object} event
- */
- 'mouseleave',
-
- /**
- Dispatched when functional mouse button is pressed on top of file-picker area.
-
- @event mousedown
- @param {Object} event
- */
- 'mousedown',
-
- /**
- Dispatched when functional mouse button is released on top of file-picker area.
-
- @event mouseup
- @param {Object} event
- */
- 'mouseup'
- ];
-
- function FileInput(options) {
- var self = this,
- container, browseButton, defaults;
-
- // if flat argument passed it should be browse_button id
- if (Basic.inArray(Basic.typeOf(options), ['string', 'node']) !== -1) {
- options = { browse_button : options };
- }
-
- // this will help us to find proper default container
- browseButton = Dom.get(options.browse_button);
- if (!browseButton) {
- // browse button is required
- throw new x.DOMException(x.DOMException.NOT_FOUND_ERR);
- }
-
- // figure out the options
- defaults = {
- accept: [{
- title: I18n.translate('All Files'),
- extensions: '*'
- }],
- name: 'file',
- multiple: false,
- required_caps: false,
- container: browseButton.parentNode || document.body
- };
-
- options = Basic.extend({}, defaults, options);
-
- // convert to object representation
- if (typeof(options.required_caps) === 'string') {
- options.required_caps = Runtime.parseCaps(options.required_caps);
- }
-
- // normalize accept option (could be list of mime types or array of title/extensions pairs)
- if (typeof(options.accept) === 'string') {
- options.accept = Mime.mimes2extList(options.accept);
- }
-
- container = Dom.get(options.container);
- // make sure we have container
- if (!container) {
- container = document.body;
- }
-
- // make container relative, if it's not
- if (Dom.getStyle(container, 'position') === 'static') {
- container.style.position = 'relative';
- }
-
- container = browseButton = null; // IE
-
- RuntimeClient.call(self);
-
- Basic.extend(self, {
- /**
- Unique id of the component
-
- @property uid
- @protected
- @readOnly
- @type {String}
- @default UID
- */
- uid: Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if any.
-
- @property ruid
- @protected
- @type {String}
- */
- ruid: null,
-
- /**
- Unique id of the runtime container. Useful to get hold of it for various manipulations.
-
- @property shimid
- @protected
- @type {String}
- */
- shimid: null,
-
- /**
- Array of selected mOxie.File objects
-
- @property files
- @type {Array}
- @default null
- */
- files: null,
-
- /**
- Initializes the file-picker, connects it to runtime and dispatches event ready when done.
-
- @method init
- */
- init: function() {
- self.convertEventPropsToHandlers(dispatches);
-
- self.bind('RuntimeInit', function(e, runtime) {
- self.ruid = runtime.uid;
- self.shimid = runtime.shimid;
-
- self.bind("Ready", function() {
- self.trigger("Refresh");
- }, 999);
-
- self.bind("Change", function() {
- var files = runtime.exec.call(self, 'FileInput', 'getFiles');
-
- self.files = [];
-
- Basic.each(files, function(file) {
- // ignore empty files (IE10 for example hangs if you try to send them via XHR)
- if (file.size === 0) {
- return true;
- }
- self.files.push(new File(self.ruid, file));
- });
- }, 999);
-
- // re-position and resize shim container
- self.bind('Refresh', function() {
- var pos, size, browseButton, shimContainer;
-
- browseButton = Dom.get(options.browse_button);
- shimContainer = Dom.get(runtime.shimid); // do not use runtime.getShimContainer(), since it will create container if it doesn't exist
-
- if (browseButton) {
- pos = Dom.getPos(browseButton, Dom.get(options.container));
- size = Dom.getSize(browseButton);
-
- if (shimContainer) {
- Basic.extend(shimContainer.style, {
- top : pos.y + 'px',
- left : pos.x + 'px',
- width : size.w + 'px',
- height : size.h + 'px'
- });
- }
- }
- shimContainer = browseButton = null;
- });
-
- runtime.exec.call(self, 'FileInput', 'init', options);
- });
-
- // runtime needs: options.required_features, options.runtime_order and options.container
- self.connectRuntime(Basic.extend({}, options, {
- required_caps: {
- select_file: true
- }
- }));
- },
-
- /**
- Disables file-picker element, so that it doesn't react to mouse clicks.
-
- @method disable
- @param {Boolean} [state=true] Disable component if - true, enable if - false
- */
- disable: function(state) {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileInput', 'disable', Basic.typeOf(state) === 'undefined' ? true : state);
- }
- },
-
-
- /**
- Reposition and resize dialog trigger to match the position and size of browse_button element.
-
- @method refresh
- */
- refresh: function() {
- self.trigger("Refresh");
- },
-
-
- /**
- Destroy component.
-
- @method destroy
- */
- destroy: function() {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileInput', 'destroy');
- this.disconnectRuntime();
- }
-
- if (Basic.typeOf(this.files) === 'array') {
- // no sense in leaving associated files behind
- Basic.each(this.files, function(file) {
- file.destroy();
- });
- }
- this.files = null;
- }
- });
- }
-
- FileInput.prototype = EventTarget.instance;
-
- return FileInput;
-});
-
-// Included from: src/javascript/file/FileDrop.js
-
-/**
- * FileDrop.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileDrop', [
- 'moxie/core/I18n',
- 'moxie/core/utils/Dom',
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic',
- 'moxie/file/File',
- 'moxie/runtime/RuntimeClient',
- 'moxie/core/EventTarget',
- 'moxie/core/utils/Mime'
-], function(I18n, Dom, x, Basic, File, RuntimeClient, EventTarget, Mime) {
- /**
- Turn arbitrary DOM element to a drop zone accepting files. Converts selected files to _File_ objects, to be used
- in conjunction with _Image_, preloaded in memory with _FileReader_ or uploaded to a server through
- _XMLHttpRequest_.
-
- @example
-
- Drop files here
-
-
-
-
-
-
- @class FileDrop
- @constructor
- @extends EventTarget
- @uses RuntimeClient
- @param {Object|String} options If options has typeof string, argument is considered as options.drop_zone
- @param {String|DOMElement} options.drop_zone DOM Element to turn into a drop zone
- @param {Array} [options.accept] Array of mime types to accept. By default accepts all
- @param {Object|String} [options.required_caps] Set of required capabilities, that chosen runtime must support
- */
- var dispatches = [
- /**
- Dispatched when runtime is connected and drop zone is ready to accept files.
-
- @event ready
- @param {Object} event
- */
- 'ready',
-
- /**
- Dispatched when dragging cursor enters the drop zone.
-
- @event dragenter
- @param {Object} event
- */
- 'dragenter',
-
- /**
- Dispatched when dragging cursor leaves the drop zone.
-
- @event dragleave
- @param {Object} event
- */
- 'dragleave',
-
- /**
- Dispatched when file is dropped onto the drop zone.
-
- @event drop
- @param {Object} event
- */
- 'drop',
-
- /**
- Dispatched if error occurs.
-
- @event error
- @param {Object} event
- */
- 'error'
- ];
-
- function FileDrop(options) {
- var self = this, defaults;
-
- // if flat argument passed it should be drop_zone id
- if (typeof(options) === 'string') {
- options = { drop_zone : options };
- }
-
- // figure out the options
- defaults = {
- accept: [{
- title: I18n.translate('All Files'),
- extensions: '*'
- }],
- required_caps: {
- drag_and_drop: true
- }
- };
-
- options = typeof(options) === 'object' ? Basic.extend({}, defaults, options) : defaults;
-
- // this will help us to find proper default container
- options.container = Dom.get(options.drop_zone) || document.body;
-
- // make container relative, if it is not
- if (Dom.getStyle(options.container, 'position') === 'static') {
- options.container.style.position = 'relative';
- }
-
- // normalize accept option (could be list of mime types or array of title/extensions pairs)
- if (typeof(options.accept) === 'string') {
- options.accept = Mime.mimes2extList(options.accept);
- }
-
- RuntimeClient.call(self);
-
- Basic.extend(self, {
- uid: Basic.guid('uid_'),
-
- ruid: null,
-
- files: null,
-
- init: function() {
-
- self.convertEventPropsToHandlers(dispatches);
-
- self.bind('RuntimeInit', function(e, runtime) {
- self.ruid = runtime.uid;
-
- self.bind("Drop", function() {
- var files = runtime.exec.call(self, 'FileDrop', 'getFiles');
-
- self.files = [];
-
- Basic.each(files, function(file) {
- self.files.push(new File(self.ruid, file));
- });
- }, 999);
-
- runtime.exec.call(self, 'FileDrop', 'init', options);
-
- self.dispatchEvent('ready');
- });
-
- // runtime needs: options.required_features, options.runtime_order and options.container
- self.connectRuntime(options); // throws RuntimeError
- },
-
- destroy: function() {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileDrop', 'destroy');
- this.disconnectRuntime();
- }
- this.files = null;
- }
- });
- }
-
- FileDrop.prototype = EventTarget.instance;
-
- return FileDrop;
-});
-
-// Included from: src/javascript/runtime/RuntimeTarget.js
-
-/**
- * RuntimeTarget.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/RuntimeTarget', [
- 'moxie/core/utils/Basic',
- 'moxie/runtime/RuntimeClient',
- "moxie/core/EventTarget"
-], function(Basic, RuntimeClient, EventTarget) {
- /**
- Instance of this class can be used as a target for the events dispatched by shims,
- when allowing them onto components is for either reason inappropriate
-
- @class RuntimeTarget
- @constructor
- @protected
- @extends EventTarget
- */
- function RuntimeTarget() {
- this.uid = Basic.guid('uid_');
-
- RuntimeClient.call(this);
-
- this.destroy = function() {
- this.disconnectRuntime();
- this.unbindAll();
- };
- }
-
- RuntimeTarget.prototype = EventTarget.instance;
-
- return RuntimeTarget;
-});
-
-// Included from: src/javascript/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileReader', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Encode',
- 'moxie/core/Exceptions',
- 'moxie/core/EventTarget',
- 'moxie/file/Blob',
- 'moxie/file/File',
- 'moxie/runtime/RuntimeTarget'
-], function(Basic, Encode, x, EventTarget, Blob, File, RuntimeTarget) {
- /**
- Utility for preloading o.Blob/o.File objects in memory. By design closely follows [W3C FileReader](http://www.w3.org/TR/FileAPI/#dfn-filereader)
- interface. Where possible uses native FileReader, where - not falls back to shims.
-
- @class FileReader
- @constructor FileReader
- @extends EventTarget
- @uses RuntimeClient
- */
- var dispatches = [
-
- /**
- Dispatched when the read starts.
-
- @event loadstart
- @param {Object} event
- */
- 'loadstart',
-
- /**
- Dispatched while reading (and decoding) blob, and reporting partial Blob data (progess.loaded/progress.total).
-
- @event progress
- @param {Object} event
- */
- 'progress',
-
- /**
- Dispatched when the read has successfully completed.
-
- @event load
- @param {Object} event
- */
- 'load',
-
- /**
- Dispatched when the read has been aborted. For instance, by invoking the abort() method.
-
- @event abort
- @param {Object} event
- */
- 'abort',
-
- /**
- Dispatched when the read has failed.
-
- @event error
- @param {Object} event
- */
- 'error',
-
- /**
- Dispatched when the request has completed (either in success or failure).
-
- @event loadend
- @param {Object} event
- */
- 'loadend'
- ];
-
- function FileReader() {
- var self = this, _fr;
-
- Basic.extend(this, {
- /**
- UID of the component instance.
-
- @property uid
- @type {String}
- */
- uid: Basic.guid('uid_'),
-
- /**
- Contains current state of FileReader object. Can take values of FileReader.EMPTY, FileReader.LOADING
- and FileReader.DONE.
-
- @property readyState
- @type {Number}
- @default FileReader.EMPTY
- */
- readyState: FileReader.EMPTY,
-
- /**
- Result of the successful read operation.
-
- @property result
- @type {String}
- */
- result: null,
-
- /**
- Stores the error of failed asynchronous read operation.
-
- @property error
- @type {DOMError}
- */
- error: null,
-
- /**
- Initiates reading of File/Blob object contents to binary string.
-
- @method readAsBinaryString
- @param {Blob|File} blob Object to preload
- */
- readAsBinaryString: function(blob) {
- _read.call(this, 'readAsBinaryString', blob);
- },
-
- /**
- Initiates reading of File/Blob object contents to dataURL string.
-
- @method readAsDataURL
- @param {Blob|File} blob Object to preload
- */
- readAsDataURL: function(blob) {
- _read.call(this, 'readAsDataURL', blob);
- },
-
- /**
- Initiates reading of File/Blob object contents to string.
-
- @method readAsText
- @param {Blob|File} blob Object to preload
- */
- readAsText: function(blob) {
- _read.call(this, 'readAsText', blob);
- },
-
- /**
- Aborts preloading process.
-
- @method abort
- */
- abort: function() {
- this.result = null;
-
- if (Basic.inArray(this.readyState, [FileReader.EMPTY, FileReader.DONE]) !== -1) {
- return;
- } else if (this.readyState === FileReader.LOADING) {
- this.readyState = FileReader.DONE;
- }
-
- if (_fr) {
- _fr.getRuntime().exec.call(this, 'FileReader', 'abort');
- }
-
- this.trigger('abort');
- this.trigger('loadend');
- },
-
- /**
- Destroy component and release resources.
-
- @method destroy
- */
- destroy: function() {
- this.abort();
-
- if (_fr) {
- _fr.getRuntime().exec.call(this, 'FileReader', 'destroy');
- _fr.disconnectRuntime();
- }
-
- self = _fr = null;
- }
- });
-
-
- function _read(op, blob) {
- _fr = new RuntimeTarget();
-
- function error(err) {
- self.readyState = FileReader.DONE;
- self.error = err;
- self.trigger('error');
- loadEnd();
- }
-
- function loadEnd() {
- _fr.destroy();
- _fr = null;
- self.trigger('loadend');
- }
-
- function exec(runtime) {
- _fr.bind('Error', function(e, err) {
- error(err);
- });
-
- _fr.bind('Progress', function(e) {
- self.result = runtime.exec.call(_fr, 'FileReader', 'getResult');
- self.trigger(e);
- });
-
- _fr.bind('Load', function(e) {
- self.readyState = FileReader.DONE;
- self.result = runtime.exec.call(_fr, 'FileReader', 'getResult');
- self.trigger(e);
- loadEnd();
- });
-
- runtime.exec.call(_fr, 'FileReader', 'read', op, blob);
- }
-
- this.convertEventPropsToHandlers(dispatches);
-
- if (this.readyState === FileReader.LOADING) {
- return error(new x.DOMException(x.DOMException.INVALID_STATE_ERR));
- }
-
- this.readyState = FileReader.LOADING;
- this.trigger('loadstart');
-
- // if source is o.Blob/o.File
- if (blob instanceof Blob) {
- if (blob.isDetached()) {
- var src = blob.getSource();
- switch (op) {
- case 'readAsText':
- case 'readAsBinaryString':
- this.result = src;
- break;
- case 'readAsDataURL':
- this.result = 'data:' + blob.type + ';base64,' + Encode.btoa(src);
- break;
- }
- this.readyState = FileReader.DONE;
- this.trigger('load');
- loadEnd();
- } else {
- exec(_fr.connectRuntime(blob.ruid));
- }
- } else {
- error(new x.DOMException(x.DOMException.NOT_FOUND_ERR));
- }
- }
- }
-
- /**
- Initial FileReader state
-
- @property EMPTY
- @type {Number}
- @final
- @static
- @default 0
- */
- FileReader.EMPTY = 0;
-
- /**
- FileReader switches to this state when it is preloading the source
-
- @property LOADING
- @type {Number}
- @final
- @static
- @default 1
- */
- FileReader.LOADING = 1;
-
- /**
- Preloading is complete, this is a final state
-
- @property DONE
- @type {Number}
- @final
- @static
- @default 2
- */
- FileReader.DONE = 2;
-
- FileReader.prototype = EventTarget.instance;
-
- return FileReader;
-});
-
-// Included from: src/javascript/core/utils/Url.js
-
-/**
- * Url.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Url', [], function() {
- /**
- Parse url into separate components and fill in absent parts with parts from current url,
- based on https://raw.github.com/kvz/phpjs/master/functions/url/parse_url.js
-
- @method parseUrl
- @for Utils
- @static
- @param {String} url Url to parse (defaults to empty string if undefined)
- @return {Object} Hash containing extracted uri components
- */
- var parseUrl = function(url, currentUrl) {
- var key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'fragment']
- , i = key.length
- , ports = {
- http: 80,
- https: 443
- }
- , uri = {}
- , regex = /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/
- , m = regex.exec(url || '')
- ;
-
- while (i--) {
- if (m[i]) {
- uri[key[i]] = m[i];
- }
- }
-
- // when url is relative, we set the origin and the path ourselves
- if (!uri.scheme) {
- // come up with defaults
- if (!currentUrl || typeof(currentUrl) === 'string') {
- currentUrl = parseUrl(currentUrl || document.location.href);
- }
-
- uri.scheme = currentUrl.scheme;
- uri.host = currentUrl.host;
- uri.port = currentUrl.port;
-
- var path = '';
- // for urls without trailing slash we need to figure out the path
- if (/^[^\/]/.test(uri.path)) {
- path = currentUrl.path;
- // if path ends with a filename, strip it
- if (!/(\/|\/[^\.]+)$/.test(path)) {
- path = path.replace(/\/[^\/]+$/, '/');
- } else {
- path += '/';
- }
- }
- uri.path = path + (uri.path || ''); // site may reside at domain.com or domain.com/subdir
- }
-
- if (!uri.port) {
- uri.port = ports[uri.scheme] || 80;
- }
-
- uri.port = parseInt(uri.port, 10);
-
- if (!uri.path) {
- uri.path = "/";
- }
-
- delete uri.source;
-
- return uri;
- };
-
- /**
- Resolve url - among other things will turn relative url to absolute
-
- @method resolveUrl
- @static
- @param {String} url Either absolute or relative
- @return {String} Resolved, absolute url
- */
- var resolveUrl = function(url) {
- var ports = { // we ignore default ports
- http: 80,
- https: 443
- }
- , urlp = parseUrl(url)
- ;
-
- return urlp.scheme + '://' + urlp.host + (urlp.port !== ports[urlp.scheme] ? ':' + urlp.port : '') + urlp.path + (urlp.query ? urlp.query : '');
- };
-
- /**
- Check if specified url has the same origin as the current document
-
- @method hasSameOrigin
- @param {String|Object} url
- @return {Boolean}
- */
- var hasSameOrigin = function(url) {
- function origin(url) {
- return [url.scheme, url.host, url.port].join('/');
- }
-
- if (typeof url === 'string') {
- url = parseUrl(url);
- }
-
- return origin(parseUrl()) === origin(url);
- };
-
- return {
- parseUrl: parseUrl,
- resolveUrl: resolveUrl,
- hasSameOrigin: hasSameOrigin
- };
-});
-
-// Included from: src/javascript/file/FileReaderSync.js
-
-/**
- * FileReaderSync.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileReaderSync', [
- 'moxie/core/utils/Basic',
- 'moxie/runtime/RuntimeClient',
- 'moxie/core/utils/Encode'
-], function(Basic, RuntimeClient, Encode) {
- /**
- Synchronous FileReader implementation. Something like this is available in WebWorkers environment, here
- it can be used to read only preloaded blobs/files and only below certain size (not yet sure what that'd be,
- but probably < 1mb). Not meant to be used directly by user.
-
- @class FileReaderSync
- @private
- @constructor
- */
- return function() {
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- uid: Basic.guid('uid_'),
-
- readAsBinaryString: function(blob) {
- return _read.call(this, 'readAsBinaryString', blob);
- },
-
- readAsDataURL: function(blob) {
- return _read.call(this, 'readAsDataURL', blob);
- },
-
- /*readAsArrayBuffer: function(blob) {
- return _read.call(this, 'readAsArrayBuffer', blob);
- },*/
-
- readAsText: function(blob) {
- return _read.call(this, 'readAsText', blob);
- }
- });
-
- function _read(op, blob) {
- if (blob.isDetached()) {
- var src = blob.getSource();
- switch (op) {
- case 'readAsBinaryString':
- return src;
- case 'readAsDataURL':
- return 'data:' + blob.type + ';base64,' + Encode.btoa(src);
- case 'readAsText':
- var txt = '';
- for (var i = 0, length = src.length; i < length; i++) {
- txt += String.fromCharCode(src[i]);
- }
- return txt;
- }
- } else {
- var result = this.connectRuntime(blob.ruid).exec.call(this, 'FileReaderSync', 'read', op, blob);
- this.disconnectRuntime();
- return result;
- }
- }
- };
-});
-
-// Included from: src/javascript/xhr/FormData.js
-
-/**
- * FormData.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/xhr/FormData", [
- "moxie/core/Exceptions",
- "moxie/core/utils/Basic",
- "moxie/file/Blob"
-], function(x, Basic, Blob) {
- /**
- FormData
-
- @class FormData
- @constructor
- */
- function FormData() {
- var _blob, _fields = [];
-
- Basic.extend(this, {
- /**
- Append another key-value pair to the FormData object
-
- @method append
- @param {String} name Name for the new field
- @param {String|Blob|Array|Object} value Value for the field
- */
- append: function(name, value) {
- var self = this, valueType = Basic.typeOf(value);
-
- // according to specs value might be either Blob or String
- if (value instanceof Blob) {
- _blob = {
- name: name,
- value: value // unfortunately we can only send single Blob in one FormData
- };
- } else if ('array' === valueType) {
- name += '[]';
-
- Basic.each(value, function(value) {
- self.append(name, value);
- });
- } else if ('object' === valueType) {
- Basic.each(value, function(value, key) {
- self.append(name + '[' + key + ']', value);
- });
- } else if ('null' === valueType || 'undefined' === valueType || 'number' === valueType && isNaN(value)) {
- self.append(name, "false");
- } else {
- _fields.push({
- name: name,
- value: value.toString()
- });
- }
- },
-
- /**
- Checks if FormData contains Blob.
-
- @method hasBlob
- @return {Boolean}
- */
- hasBlob: function() {
- return !!this.getBlob();
- },
-
- /**
- Retrieves blob.
-
- @method getBlob
- @return {Object} Either Blob if found or null
- */
- getBlob: function() {
- return _blob && _blob.value || null;
- },
-
- /**
- Retrieves blob field name.
-
- @method getBlobName
- @return {String} Either Blob field name or null
- */
- getBlobName: function() {
- return _blob && _blob.name || null;
- },
-
- /**
- Loop over the fields in FormData and invoke the callback for each of them.
-
- @method each
- @param {Function} cb Callback to call for each field
- */
- each: function(cb) {
- Basic.each(_fields, function(field) {
- cb(field.value, field.name);
- });
-
- if (_blob) {
- cb(_blob.value, _blob.name);
- }
- },
-
- destroy: function() {
- _blob = null;
- _fields = [];
- }
- });
- }
-
- return FormData;
-});
-
-// Included from: src/javascript/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/xhr/XMLHttpRequest", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/core/EventTarget",
- "moxie/core/utils/Encode",
- "moxie/core/utils/Url",
- "moxie/runtime/Runtime",
- "moxie/runtime/RuntimeTarget",
- "moxie/file/Blob",
- "moxie/file/FileReaderSync",
- "moxie/xhr/FormData",
- "moxie/core/utils/Env",
- "moxie/core/utils/Mime"
-], function(Basic, x, EventTarget, Encode, Url, Runtime, RuntimeTarget, Blob, FileReaderSync, FormData, Env, Mime) {
-
- var httpCode = {
- 100: 'Continue',
- 101: 'Switching Protocols',
- 102: 'Processing',
-
- 200: 'OK',
- 201: 'Created',
- 202: 'Accepted',
- 203: 'Non-Authoritative Information',
- 204: 'No Content',
- 205: 'Reset Content',
- 206: 'Partial Content',
- 207: 'Multi-Status',
- 226: 'IM Used',
-
- 300: 'Multiple Choices',
- 301: 'Moved Permanently',
- 302: 'Found',
- 303: 'See Other',
- 304: 'Not Modified',
- 305: 'Use Proxy',
- 306: 'Reserved',
- 307: 'Temporary Redirect',
-
- 400: 'Bad Request',
- 401: 'Unauthorized',
- 402: 'Payment Required',
- 403: 'Forbidden',
- 404: 'Not Found',
- 405: 'Method Not Allowed',
- 406: 'Not Acceptable',
- 407: 'Proxy Authentication Required',
- 408: 'Request Timeout',
- 409: 'Conflict',
- 410: 'Gone',
- 411: 'Length Required',
- 412: 'Precondition Failed',
- 413: 'Request Entity Too Large',
- 414: 'Request-URI Too Long',
- 415: 'Unsupported Media Type',
- 416: 'Requested Range Not Satisfiable',
- 417: 'Expectation Failed',
- 422: 'Unprocessable Entity',
- 423: 'Locked',
- 424: 'Failed Dependency',
- 426: 'Upgrade Required',
-
- 500: 'Internal Server Error',
- 501: 'Not Implemented',
- 502: 'Bad Gateway',
- 503: 'Service Unavailable',
- 504: 'Gateway Timeout',
- 505: 'HTTP Version Not Supported',
- 506: 'Variant Also Negotiates',
- 507: 'Insufficient Storage',
- 510: 'Not Extended'
- };
-
- function XMLHttpRequestUpload() {
- this.uid = Basic.guid('uid_');
- }
-
- XMLHttpRequestUpload.prototype = EventTarget.instance;
-
- /**
- Implementation of XMLHttpRequest
-
- @class XMLHttpRequest
- @constructor
- @uses RuntimeClient
- @extends EventTarget
- */
- var dispatches = ['loadstart', 'progress', 'abort', 'error', 'load', 'timeout', 'loadend']; // & readystatechange (for historical reasons)
-
- var NATIVE = 1, RUNTIME = 2;
-
- function XMLHttpRequest() {
- var self = this,
- // this (together with _p() @see below) is here to gracefully upgrade to setter/getter syntax where possible
- props = {
- /**
- The amount of milliseconds a request can take before being terminated. Initially zero. Zero means there is no timeout.
-
- @property timeout
- @type Number
- @default 0
- */
- timeout: 0,
-
- /**
- Current state, can take following values:
- UNSENT (numeric value 0)
- The object has been constructed.
-
- OPENED (numeric value 1)
- The open() method has been successfully invoked. During this state request headers can be set using setRequestHeader() and the request can be made using the send() method.
-
- HEADERS_RECEIVED (numeric value 2)
- All redirects (if any) have been followed and all HTTP headers of the final response have been received. Several response members of the object are now available.
-
- LOADING (numeric value 3)
- The response entity body is being received.
-
- DONE (numeric value 4)
-
- @property readyState
- @type Number
- @default 0 (UNSENT)
- */
- readyState: XMLHttpRequest.UNSENT,
-
- /**
- True when user credentials are to be included in a cross-origin request. False when they are to be excluded
- in a cross-origin request and when cookies are to be ignored in its response. Initially false.
-
- @property withCredentials
- @type Boolean
- @default false
- */
- withCredentials: false,
-
- /**
- Returns the HTTP status code.
-
- @property status
- @type Number
- @default 0
- */
- status: 0,
-
- /**
- Returns the HTTP status text.
-
- @property statusText
- @type String
- */
- statusText: "",
-
- /**
- Returns the response type. Can be set to change the response type. Values are:
- the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
-
- @property responseType
- @type String
- */
- responseType: "",
-
- /**
- Returns the document response entity body.
-
- Throws an "InvalidStateError" exception if responseType is not the empty string or "document".
-
- @property responseXML
- @type Document
- */
- responseXML: null,
-
- /**
- Returns the text response entity body.
-
- Throws an "InvalidStateError" exception if responseType is not the empty string or "text".
-
- @property responseText
- @type String
- */
- responseText: null,
-
- /**
- Returns the response entity body (http://www.w3.org/TR/XMLHttpRequest/#response-entity-body).
- Can become: ArrayBuffer, Blob, Document, JSON, Text
-
- @property response
- @type Mixed
- */
- response: null
- },
-
- _async = true,
- _url,
- _method,
- _headers = {},
- _user,
- _password,
- _encoding = null,
- _mimeType = null,
-
- // flags
- _sync_flag = false,
- _send_flag = false,
- _upload_events_flag = false,
- _upload_complete_flag = false,
- _error_flag = false,
- _same_origin_flag = false,
-
- // times
- _start_time,
- _timeoutset_time,
-
- _finalMime = null,
- _finalCharset = null,
-
- _options = {},
- _xhr,
- _responseHeaders = '',
- _responseHeadersBag
- ;
-
-
- Basic.extend(this, props, {
- /**
- Unique id of the component
-
- @property uid
- @type String
- */
- uid: Basic.guid('uid_'),
-
- /**
- Target for Upload events
-
- @property upload
- @type XMLHttpRequestUpload
- */
- upload: new XMLHttpRequestUpload(),
-
-
- /**
- Sets the request method, request URL, synchronous flag, request username, and request password.
-
- Throws a "SyntaxError" exception if one of the following is true:
-
- method is not a valid HTTP method.
- url cannot be resolved.
- url contains the "user:password" format in the userinfo production.
- Throws a "SecurityError" exception if method is a case-insensitive match for CONNECT, TRACE or TRACK.
-
- Throws an "InvalidAccessError" exception if one of the following is true:
-
- Either user or password is passed as argument and the origin of url does not match the XMLHttpRequest origin.
- There is an associated XMLHttpRequest document and either the timeout attribute is not zero,
- the withCredentials attribute is true, or the responseType attribute is not the empty string.
-
-
- @method open
- @param {String} method HTTP method to use on request
- @param {String} url URL to request
- @param {Boolean} [async=true] If false request will be done in synchronous manner. Asynchronous by default.
- @param {String} [user] Username to use in HTTP authentication process on server-side
- @param {String} [password] Password to use in HTTP authentication process on server-side
- */
- open: function(method, url, async, user, password) {
- var urlp;
-
- // first two arguments are required
- if (!method || !url) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 2 - check if any code point in method is higher than U+00FF or after deflating method it does not match the method
- if (/[\u0100-\uffff]/.test(method) || Encode.utf8_encode(method) !== method) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 3
- if (!!~Basic.inArray(method.toUpperCase(), ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'TRACE', 'TRACK'])) {
- _method = method.toUpperCase();
- }
-
-
- // 4 - allowing these methods poses a security risk
- if (!!~Basic.inArray(_method, ['CONNECT', 'TRACE', 'TRACK'])) {
- throw new x.DOMException(x.DOMException.SECURITY_ERR);
- }
-
- // 5
- url = Encode.utf8_encode(url);
-
- // 6 - Resolve url relative to the XMLHttpRequest base URL. If the algorithm returns an error, throw a "SyntaxError".
- urlp = Url.parseUrl(url);
-
- _same_origin_flag = Url.hasSameOrigin(urlp);
-
- // 7 - manually build up absolute url
- _url = Url.resolveUrl(url);
-
- // 9-10, 12-13
- if ((user || password) && !_same_origin_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- _user = user || urlp.user;
- _password = password || urlp.pass;
-
- // 11
- _async = async || true;
-
- if (_async === false && (_p('timeout') || _p('withCredentials') || _p('responseType') !== "")) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 14 - terminate abort()
-
- // 15 - terminate send()
-
- // 18
- _sync_flag = !_async;
- _send_flag = false;
- _headers = {};
- _reset.call(this);
-
- // 19
- _p('readyState', XMLHttpRequest.OPENED);
-
- // 20
- this.convertEventPropsToHandlers(['readystatechange']); // unify event handlers
- this.dispatchEvent('readystatechange');
- },
-
- /**
- Appends an header to the list of author request headers, or if header is already
- in the list of author request headers, combines its value with value.
-
- Throws an "InvalidStateError" exception if the state is not OPENED or if the send() flag is set.
- Throws a "SyntaxError" exception if header is not a valid HTTP header field name or if value
- is not a valid HTTP header field value.
-
- @method setRequestHeader
- @param {String} header
- @param {String|Number} value
- */
- setRequestHeader: function(header, value) {
- var uaHeaders = [ // these headers are controlled by the user agent
- "accept-charset",
- "accept-encoding",
- "access-control-request-headers",
- "access-control-request-method",
- "connection",
- "content-length",
- "cookie",
- "cookie2",
- "content-transfer-encoding",
- "date",
- "expect",
- "host",
- "keep-alive",
- "origin",
- "referer",
- "te",
- "trailer",
- "transfer-encoding",
- "upgrade",
- "user-agent",
- "via"
- ];
-
- // 1-2
- if (_p('readyState') !== XMLHttpRequest.OPENED || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3
- if (/[\u0100-\uffff]/.test(header) || Encode.utf8_encode(header) !== header) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 4
- /* this step is seemingly bypassed in browsers, probably to allow various unicode characters in header values
- if (/[\u0100-\uffff]/.test(value) || Encode.utf8_encode(value) !== value) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }*/
-
- header = Basic.trim(header).toLowerCase();
-
- // setting of proxy-* and sec-* headers is prohibited by spec
- if (!!~Basic.inArray(header, uaHeaders) || /^(proxy\-|sec\-)/.test(header)) {
- return false;
- }
-
- // camelize
- // browsers lowercase header names (at least for custom ones)
- // header = header.replace(/\b\w/g, function($1) { return $1.toUpperCase(); });
-
- if (!_headers[header]) {
- _headers[header] = value;
- } else {
- // http://tools.ietf.org/html/rfc2616#section-4.2 (last paragraph)
- _headers[header] += ', ' + value;
- }
- return true;
- },
-
- /**
- Returns all headers from the response, with the exception of those whose field name is Set-Cookie or Set-Cookie2.
-
- @method getAllResponseHeaders
- @return {String} reponse headers or empty string
- */
- getAllResponseHeaders: function() {
- return _responseHeaders || '';
- },
-
- /**
- Returns the header field value from the response of which the field name matches header,
- unless the field name is Set-Cookie or Set-Cookie2.
-
- @method getResponseHeader
- @param {String} header
- @return {String} value(s) for the specified header or null
- */
- getResponseHeader: function(header) {
- header = header.toLowerCase();
-
- if (_error_flag || !!~Basic.inArray(header, ['set-cookie', 'set-cookie2'])) {
- return null;
- }
-
- if (_responseHeaders && _responseHeaders !== '') {
- // if we didn't parse response headers until now, do it and keep for later
- if (!_responseHeadersBag) {
- _responseHeadersBag = {};
- Basic.each(_responseHeaders.split(/\r\n/), function(line) {
- var pair = line.split(/:\s+/);
- if (pair.length === 2) { // last line might be empty, omit
- pair[0] = Basic.trim(pair[0]); // just in case
- _responseHeadersBag[pair[0].toLowerCase()] = { // simply to retain header name in original form
- header: pair[0],
- value: Basic.trim(pair[1])
- };
- }
- });
- }
- if (_responseHeadersBag.hasOwnProperty(header)) {
- return _responseHeadersBag[header].header + ': ' + _responseHeadersBag[header].value;
- }
- }
- return null;
- },
-
- /**
- Sets the Content-Type header for the response to mime.
- Throws an "InvalidStateError" exception if the state is LOADING or DONE.
- Throws a "SyntaxError" exception if mime is not a valid media type.
-
- @method overrideMimeType
- @param String mime Mime type to set
- */
- overrideMimeType: function(mime) {
- var matches, charset;
-
- // 1
- if (!!~Basic.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2
- mime = Basic.trim(mime.toLowerCase());
-
- if (/;/.test(mime) && (matches = mime.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))) {
- mime = matches[1];
- if (matches[2]) {
- charset = matches[2];
- }
- }
-
- if (!Mime.mimes[mime]) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 3-4
- _finalMime = mime;
- _finalCharset = charset;
- },
-
- /**
- Initiates the request. The optional argument provides the request entity body.
- The argument is ignored if request method is GET or HEAD.
-
- Throws an "InvalidStateError" exception if the state is not OPENED or if the send() flag is set.
-
- @method send
- @param {Blob|Document|String|FormData} [data] Request entity body
- @param {Object} [options] Set of requirements and pre-requisities for runtime initialization
- */
- send: function(data, options) {
- if (Basic.typeOf(options) === 'string') {
- _options = { ruid: options };
- } else if (!options) {
- _options = {};
- } else {
- _options = options;
- }
-
- this.convertEventPropsToHandlers(dispatches);
- this.upload.convertEventPropsToHandlers(dispatches);
-
- // 1-2
- if (this.readyState !== XMLHttpRequest.OPENED || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3
- // sending Blob
- if (data instanceof Blob) {
- _options.ruid = data.ruid;
- _mimeType = data.type || 'application/octet-stream';
- }
-
- // FormData
- else if (data instanceof FormData) {
- if (data.hasBlob()) {
- var blob = data.getBlob();
- _options.ruid = blob.ruid;
- _mimeType = blob.type || 'application/octet-stream';
- }
- }
-
- // DOMString
- else if (typeof data === 'string') {
- _encoding = 'UTF-8';
- _mimeType = 'text/plain;charset=UTF-8';
-
- // data should be converted to Unicode and encoded as UTF-8
- data = Encode.utf8_encode(data);
- }
-
- // if withCredentials not set, but requested, set it automatically
- if (!this.withCredentials) {
- this.withCredentials = (_options.required_caps && _options.required_caps.send_browser_cookies) && !_same_origin_flag;
- }
-
- // 4 - storage mutex
- // 5
- _upload_events_flag = (!_sync_flag && this.upload.hasEventListener()); // DSAP
- // 6
- _error_flag = false;
- // 7
- _upload_complete_flag = !data;
- // 8 - Asynchronous steps
- if (!_sync_flag) {
- // 8.1
- _send_flag = true;
- // 8.2
- // this.dispatchEvent('loadstart'); // will be dispatched either by native or runtime xhr
- // 8.3
- //if (!_upload_complete_flag) {
- // this.upload.dispatchEvent('loadstart'); // will be dispatched either by native or runtime xhr
- //}
- }
- // 8.5 - Return the send() method call, but continue running the steps in this algorithm.
- _doXHR.call(this, data);
- },
-
- /**
- Cancels any network activity.
-
- @method abort
- */
- abort: function() {
- _error_flag = true;
- _sync_flag = false;
-
- if (!~Basic.inArray(_p('readyState'), [XMLHttpRequest.UNSENT, XMLHttpRequest.OPENED, XMLHttpRequest.DONE])) {
- _p('readyState', XMLHttpRequest.DONE);
- _send_flag = false;
-
- if (_xhr) {
- _xhr.getRuntime().exec.call(_xhr, 'XMLHttpRequest', 'abort', _upload_complete_flag);
- } else {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- _upload_complete_flag = true;
- } else {
- _p('readyState', XMLHttpRequest.UNSENT);
- }
- },
-
- destroy: function() {
- if (_xhr) {
- if (Basic.typeOf(_xhr.destroy) === 'function') {
- _xhr.destroy();
- }
- _xhr = null;
- }
-
- this.unbindAll();
-
- if (this.upload) {
- this.upload.unbindAll();
- this.upload = null;
- }
- }
- });
-
- /* this is nice, but maybe too lengthy
-
- // if supported by JS version, set getters/setters for specific properties
- o.defineProperty(this, 'readyState', {
- configurable: false,
-
- get: function() {
- return _p('readyState');
- }
- });
-
- o.defineProperty(this, 'timeout', {
- configurable: false,
-
- get: function() {
- return _p('timeout');
- },
-
- set: function(value) {
-
- if (_sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // timeout still should be measured relative to the start time of request
- _timeoutset_time = (new Date).getTime();
-
- _p('timeout', value);
- }
- });
-
- // the withCredentials attribute has no effect when fetching same-origin resources
- o.defineProperty(this, 'withCredentials', {
- configurable: false,
-
- get: function() {
- return _p('withCredentials');
- },
-
- set: function(value) {
- // 1-2
- if (!~o.inArray(_p('readyState'), [XMLHttpRequest.UNSENT, XMLHttpRequest.OPENED]) || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3-4
- if (_anonymous_flag || _sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 5
- _p('withCredentials', value);
- }
- });
-
- o.defineProperty(this, 'status', {
- configurable: false,
-
- get: function() {
- return _p('status');
- }
- });
-
- o.defineProperty(this, 'statusText', {
- configurable: false,
-
- get: function() {
- return _p('statusText');
- }
- });
-
- o.defineProperty(this, 'responseType', {
- configurable: false,
-
- get: function() {
- return _p('responseType');
- },
-
- set: function(value) {
- // 1
- if (!!~o.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2
- if (_sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 3
- _p('responseType', value.toLowerCase());
- }
- });
-
- o.defineProperty(this, 'responseText', {
- configurable: false,
-
- get: function() {
- // 1
- if (!~o.inArray(_p('responseType'), ['', 'text'])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2-3
- if (_p('readyState') !== XMLHttpRequest.DONE && _p('readyState') !== XMLHttpRequest.LOADING || _error_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- return _p('responseText');
- }
- });
-
- o.defineProperty(this, 'responseXML', {
- configurable: false,
-
- get: function() {
- // 1
- if (!~o.inArray(_p('responseType'), ['', 'document'])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2-3
- if (_p('readyState') !== XMLHttpRequest.DONE || _error_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- return _p('responseXML');
- }
- });
-
- o.defineProperty(this, 'response', {
- configurable: false,
-
- get: function() {
- if (!!~o.inArray(_p('responseType'), ['', 'text'])) {
- if (_p('readyState') !== XMLHttpRequest.DONE && _p('readyState') !== XMLHttpRequest.LOADING || _error_flag) {
- return '';
- }
- }
-
- if (_p('readyState') !== XMLHttpRequest.DONE || _error_flag) {
- return null;
- }
-
- return _p('response');
- }
- });
-
- */
-
- function _p(prop, value) {
- if (!props.hasOwnProperty(prop)) {
- return;
- }
- if (arguments.length === 1) { // get
- return Env.can('define_property') ? props[prop] : self[prop];
- } else { // set
- if (Env.can('define_property')) {
- props[prop] = value;
- } else {
- self[prop] = value;
- }
- }
- }
-
- /*
- function _toASCII(str, AllowUnassigned, UseSTD3ASCIIRules) {
- // TODO: http://tools.ietf.org/html/rfc3490#section-4.1
- return str.toLowerCase();
- }
- */
-
-
- function _doXHR(data) {
- var self = this;
-
- _start_time = new Date().getTime();
-
- _xhr = new RuntimeTarget();
-
- function loadEnd() {
- _xhr.destroy();
- _xhr = null;
- self.dispatchEvent('loadend');
- self = null;
- }
-
- function exec(runtime) {
- _xhr.bind('LoadStart', function(e) {
- _p('readyState', XMLHttpRequest.LOADING);
- self.dispatchEvent('readystatechange');
-
- self.dispatchEvent(e);
-
- if (_upload_events_flag) {
- self.upload.dispatchEvent(e);
- }
- });
-
- _xhr.bind('Progress', function(e) {
- if (_p('readyState') !== XMLHttpRequest.LOADING) {
- _p('readyState', XMLHttpRequest.LOADING); // LoadStart unreliable (in Flash for example)
- self.dispatchEvent('readystatechange');
- }
- self.dispatchEvent(e);
- });
-
- _xhr.bind('UploadProgress', function(e) {
- if (_upload_events_flag) {
- self.upload.dispatchEvent({
- type: 'progress',
- lengthComputable: false,
- total: e.total,
- loaded: e.loaded
- });
- }
- });
-
- _xhr.bind('Load', function(e) {
- _p('readyState', XMLHttpRequest.DONE);
- _p('status', Number(runtime.exec.call(_xhr, 'XMLHttpRequest', 'getStatus') || 0));
- _p('statusText', httpCode[_p('status')] || "");
-
- _p('response', runtime.exec.call(_xhr, 'XMLHttpRequest', 'getResponse', _p('responseType')));
-
- if (!!~Basic.inArray(_p('responseType'), ['text', ''])) {
- _p('responseText', _p('response'));
- } else if (_p('responseType') === 'document') {
- _p('responseXML', _p('response'));
- }
-
- _responseHeaders = runtime.exec.call(_xhr, 'XMLHttpRequest', 'getAllResponseHeaders');
-
- self.dispatchEvent('readystatechange');
-
- if (_p('status') > 0) { // status 0 usually means that server is unreachable
- if (_upload_events_flag) {
- self.upload.dispatchEvent(e);
- }
- self.dispatchEvent(e);
- } else {
- _error_flag = true;
- self.dispatchEvent('error');
- }
- loadEnd();
- });
-
- _xhr.bind('Abort', function(e) {
- self.dispatchEvent(e);
- loadEnd();
- });
-
- _xhr.bind('Error', function(e) {
- _error_flag = true;
- _p('readyState', XMLHttpRequest.DONE);
- self.dispatchEvent('readystatechange');
- _upload_complete_flag = true;
- self.dispatchEvent(e);
- loadEnd();
- });
-
- runtime.exec.call(_xhr, 'XMLHttpRequest', 'send', {
- url: _url,
- method: _method,
- async: _async,
- user: _user,
- password: _password,
- headers: _headers,
- mimeType: _mimeType,
- encoding: _encoding,
- responseType: self.responseType,
- withCredentials: self.withCredentials,
- options: _options
- }, data);
- }
-
- // clarify our requirements
- if (typeof(_options.required_caps) === 'string') {
- _options.required_caps = Runtime.parseCaps(_options.required_caps);
- }
-
- _options.required_caps = Basic.extend({}, _options.required_caps, {
- return_response_type: self.responseType
- });
-
- if (data instanceof FormData) {
- _options.required_caps.send_multipart = true;
- }
-
- if (!_same_origin_flag) {
- _options.required_caps.do_cors = true;
- }
-
-
- if (_options.ruid) { // we do not need to wait if we can connect directly
- exec(_xhr.connectRuntime(_options));
- } else {
- _xhr.bind('RuntimeInit', function(e, runtime) {
- exec(runtime);
- });
- _xhr.bind('RuntimeError', function(e, err) {
- self.dispatchEvent('RuntimeError', err);
- });
- _xhr.connectRuntime(_options);
- }
- }
-
-
- function _reset() {
- _p('responseText', "");
- _p('responseXML', null);
- _p('response', null);
- _p('status', 0);
- _p('statusText', "");
- _start_time = _timeoutset_time = null;
- }
- }
-
- XMLHttpRequest.UNSENT = 0;
- XMLHttpRequest.OPENED = 1;
- XMLHttpRequest.HEADERS_RECEIVED = 2;
- XMLHttpRequest.LOADING = 3;
- XMLHttpRequest.DONE = 4;
-
- XMLHttpRequest.prototype = EventTarget.instance;
-
- return XMLHttpRequest;
-});
-
-// Included from: src/javascript/runtime/Transporter.js
-
-/**
- * Transporter.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/runtime/Transporter", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Encode",
- "moxie/runtime/RuntimeClient",
- "moxie/core/EventTarget"
-], function(Basic, Encode, RuntimeClient, EventTarget) {
- function Transporter() {
- var mod, _runtime, _data, _size, _pos, _chunk_size;
-
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- uid: Basic.guid('uid_'),
-
- state: Transporter.IDLE,
-
- result: null,
-
- transport: function(data, type, options) {
- var self = this;
-
- options = Basic.extend({
- chunk_size: 204798
- }, options);
-
- // should divide by three, base64 requires this
- if ((mod = options.chunk_size % 3)) {
- options.chunk_size += 3 - mod;
- }
-
- _chunk_size = options.chunk_size;
-
- _reset.call(this);
- _data = data;
- _size = data.length;
-
- if (Basic.typeOf(options) === 'string' || options.ruid) {
- _run.call(self, type, this.connectRuntime(options));
- } else {
- // we require this to run only once
- var cb = function(e, runtime) {
- self.unbind("RuntimeInit", cb);
- _run.call(self, type, runtime);
- };
- this.bind("RuntimeInit", cb);
- this.connectRuntime(options);
- }
- },
-
- abort: function() {
- var self = this;
-
- self.state = Transporter.IDLE;
- if (_runtime) {
- _runtime.exec.call(self, 'Transporter', 'clear');
- self.trigger("TransportingAborted");
- }
-
- _reset.call(self);
- },
-
-
- destroy: function() {
- this.unbindAll();
- _runtime = null;
- this.disconnectRuntime();
- _reset.call(this);
- }
- });
-
- function _reset() {
- _size = _pos = 0;
- _data = this.result = null;
- }
-
- function _run(type, runtime) {
- var self = this;
-
- _runtime = runtime;
-
- //self.unbind("RuntimeInit");
-
- self.bind("TransportingProgress", function(e) {
- _pos = e.loaded;
-
- if (_pos < _size && Basic.inArray(self.state, [Transporter.IDLE, Transporter.DONE]) === -1) {
- _transport.call(self);
- }
- }, 999);
-
- self.bind("TransportingComplete", function() {
- _pos = _size;
- self.state = Transporter.DONE;
- _data = null; // clean a bit
- self.result = _runtime.exec.call(self, 'Transporter', 'getAsBlob', type || '');
- }, 999);
-
- self.state = Transporter.BUSY;
- self.trigger("TransportingStarted");
- _transport.call(self);
- }
-
- function _transport() {
- var self = this,
- chunk,
- bytesLeft = _size - _pos;
-
- if (_chunk_size > bytesLeft) {
- _chunk_size = bytesLeft;
- }
-
- chunk = Encode.btoa(_data.substr(_pos, _chunk_size));
- _runtime.exec.call(self, 'Transporter', 'receive', chunk, _size);
- }
- }
-
- Transporter.IDLE = 0;
- Transporter.BUSY = 1;
- Transporter.DONE = 2;
-
- Transporter.prototype = EventTarget.instance;
-
- return Transporter;
-});
-
-// Included from: src/javascript/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/image/Image", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/Exceptions",
- "moxie/file/FileReaderSync",
- "moxie/xhr/XMLHttpRequest",
- "moxie/runtime/Runtime",
- "moxie/runtime/RuntimeClient",
- "moxie/runtime/Transporter",
- "moxie/core/utils/Env",
- "moxie/core/EventTarget",
- "moxie/file/Blob",
- "moxie/file/File",
- "moxie/core/utils/Encode"
-], function(Basic, Dom, x, FileReaderSync, XMLHttpRequest, Runtime, RuntimeClient, Transporter, Env, EventTarget, Blob, File, Encode) {
- /**
- Image preloading and manipulation utility. Additionally it provides access to image meta info (Exif, GPS) and raw binary data.
-
- @class Image
- @constructor
- @extends EventTarget
- */
- var dispatches = [
- 'progress',
-
- /**
- Dispatched when loading is complete.
-
- @event load
- @param {Object} event
- */
- 'load',
-
- 'error',
-
- /**
- Dispatched when resize operation is complete.
-
- @event resize
- @param {Object} event
- */
- 'resize',
-
- /**
- Dispatched when visual representation of the image is successfully embedded
- into the corresponsing container.
-
- @event embedded
- @param {Object} event
- */
- 'embedded'
- ];
-
- function Image() {
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- /**
- Unique id of the component
-
- @property uid
- @type {String}
- */
- uid: Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if any.
-
- @property ruid
- @type {String}
- */
- ruid: null,
-
- /**
- Name of the file, that was used to create an image, if available. If not equals to empty string.
-
- @property name
- @type {String}
- @default ""
- */
- name: "",
-
- /**
- Size of the image in bytes. Actual value is set only after image is preloaded.
-
- @property size
- @type {Number}
- @default 0
- */
- size: 0,
-
- /**
- Width of the image. Actual value is set only after image is preloaded.
-
- @property width
- @type {Number}
- @default 0
- */
- width: 0,
-
- /**
- Height of the image. Actual value is set only after image is preloaded.
-
- @property height
- @type {Number}
- @default 0
- */
- height: 0,
-
- /**
- Mime type of the image. Currently only image/jpeg and image/png are supported. Actual value is set only after image is preloaded.
-
- @property type
- @type {String}
- @default ""
- */
- type: "",
-
- /**
- Holds meta info (Exif, GPS). Is populated only for image/jpeg. Actual value is set only after image is preloaded.
-
- @property meta
- @type {Object}
- @default {}
- */
- meta: {},
-
- /**
- Alias for load method, that takes another mOxie.Image object as a source (see load).
-
- @method clone
- @param {Image} src Source for the image
- @param {Boolean} [exact=false] Whether to activate in-depth clone mode
- */
- clone: function() {
- this.load.apply(this, arguments);
- },
-
- /**
- Loads image from various sources. Currently the source for new image can be: mOxie.Image, mOxie.Blob/mOxie.File,
- native Blob/File, dataUrl or URL. Depending on the type of the source, arguments - differ. When source is URL,
- Image will be downloaded from remote destination and loaded in memory.
-
- @example
- var img = new mOxie.Image();
- img.onload = function() {
- var blob = img.getAsBlob();
-
- var formData = new mOxie.FormData();
- formData.append('file', blob);
-
- var xhr = new mOxie.XMLHttpRequest();
- xhr.onload = function() {
- // upload complete
- };
- xhr.open('post', 'upload.php');
- xhr.send(formData);
- };
- img.load("http://www.moxiecode.com/images/mox-logo.jpg"); // notice file extension (.jpg)
-
-
- @method load
- @param {Image|Blob|File|String} src Source for the image
- @param {Boolean|Object} [mixed]
- */
- load: function() {
- // this is here because to bind properly we need an uid first, which is created above
- this.bind('Load Resize', function() {
- _updateInfo.call(this);
- }, 999);
-
- this.convertEventPropsToHandlers(dispatches);
-
- _load.apply(this, arguments);
- },
-
- /**
- Downsizes the image to fit the specified width/height. If crop is supplied, image will be cropped to exact dimensions.
-
- @method downsize
- @param {Number} width Resulting width
- @param {Number} [height=width] Resulting height (optional, if not supplied will default to width)
- @param {Boolean} [crop=false] Whether to crop the image to exact dimensions
- @param {Boolean} [preserveHeaders=true] Whether to preserve meta headers (on JPEGs after resize)
- */
- downsize: function(width, height, crop, preserveHeaders) {
- try {
- if (!this.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // no way to reliably intercept the crash due to high resolution, so we simply avoid it
- if (this.width > Image.MAX_RESIZE_WIDTH || this.height > Image.MAX_RESIZE_HEIGHT) {
- throw new x.ImageError(x.ImageError.MAX_RESOLUTION_ERR);
- }
-
- if (!width && !height || Basic.typeOf(crop) === 'undefined') {
- crop = false;
- }
-
- width = width || this.width;
- height = height || this.height;
-
- preserveHeaders = (Basic.typeOf(preserveHeaders) === 'undefined' ? true : !!preserveHeaders);
-
- this.getRuntime().exec.call(this, 'Image', 'downsize', width, height, crop, preserveHeaders);
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex);
- }
- },
-
- /**
- Alias for downsize(width, height, true). (see downsize)
-
- @method crop
- @param {Number} width Resulting width
- @param {Number} [height=width] Resulting height (optional, if not supplied will default to width)
- @param {Boolean} [preserveHeaders=true] Whether to preserve meta headers (on JPEGs after resize)
- */
- crop: function(width, height, preserveHeaders) {
- this.downsize(width, height, true, preserveHeaders);
- },
-
- getAsCanvas: function() {
- if (!Env.can('create_canvas')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- var runtime = this.connectRuntime(this.ruid);
- return runtime.exec.call(this, 'Image', 'getAsCanvas');
- },
-
- /**
- Retrieves image in it's current state as mOxie.Blob object. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsBlob
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {Blob} Image as Blob
- */
- getAsBlob: function(type, quality) {
- if (!this.size) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- if (!type) {
- type = 'image/jpeg';
- }
-
- if (type === 'image/jpeg' && !quality) {
- quality = 90;
- }
-
- return this.getRuntime().exec.call(this, 'Image', 'getAsBlob', type, quality);
- },
-
- /**
- Retrieves image in it's current state as dataURL string. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsDataURL
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {String} Image as dataURL string
- */
- getAsDataURL: function(type, quality) {
- if (!this.size) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
- return this.getRuntime().exec.call(this, 'Image', 'getAsDataURL', type, quality);
- },
-
- /**
- Retrieves image in it's current state as binary string. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsBinaryString
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {String} Image as binary string
- */
- getAsBinaryString: function(type, quality) {
- var dataUrl = this.getAsDataURL(type, quality);
- return Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7));
- },
-
- /**
- Embeds the image, or better to say, it's visual representation into the specified node. Depending on the runtime
- in use, might be a canvas, or image (actual ) element or shim object (Flash or SilverLight - very rare, used for
- legacy browsers that do not have canvas or proper dataURI support).
-
- @method embed
- @param {DOMElement} el DOM element to insert the image object into
- @param {Object} options Set of key/value pairs controlling the mime type, dimensions and cropping factor of resulting
- representation
- */
- embed: function(el) {
- var self = this
- , imgCopy
- , type, quality, crop
- , options = arguments[1] || {}
- , width = this.width
- , height = this.height
- , runtime // this has to be outside of all the closures to contain proper runtime
- ;
-
- function onResize() {
- // if possible, embed a canvas element directly
- if (Env.can('create_canvas')) {
- var canvas = imgCopy.getAsCanvas();
- if (canvas) {
- el.appendChild(canvas);
- canvas = null;
- imgCopy.destroy();
- self.trigger('embedded');
- return;
- }
- }
-
- var dataUrl = imgCopy.getAsDataURL(type, quality);
- if (!dataUrl) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
-
- if (Env.can('use_data_uri_of', dataUrl.length)) {
- el.innerHTML = ' ';
- imgCopy.destroy();
- self.trigger('embedded');
- } else {
- var tr = new Transporter();
-
- tr.bind("TransportingComplete", function() {
- runtime = self.connectRuntime(this.result.ruid);
-
- self.bind("Embedded", function() {
- // position and size properly
- Basic.extend(runtime.getShimContainer().style, {
- //position: 'relative',
- top: '0px',
- left: '0px',
- width: imgCopy.width + 'px',
- height: imgCopy.height + 'px'
- });
-
- // some shims (Flash/SilverLight) reinitialize, if parent element is hidden, reordered or it's
- // position type changes (in Gecko), but since we basically need this only in IEs 6/7 and
- // sometimes 8 and they do not have this problem, we can comment this for now
- /*tr.bind("RuntimeInit", function(e, runtime) {
- tr.destroy();
- runtime.destroy();
- onResize.call(self); // re-feed our image data
- });*/
-
- runtime = null;
- }, 999);
-
- runtime.exec.call(self, "ImageView", "display", this.result.uid, width, height);
- imgCopy.destroy();
- });
-
- tr.transport(Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7)), type, Basic.extend({}, options, {
- required_caps: {
- display_media: true
- },
- runtime_order: 'flash,silverlight',
- container: el
- }));
- }
- }
-
- try {
- if (!(el = Dom.get(el))) {
- throw new x.DOMException(x.DOMException.INVALID_NODE_TYPE_ERR);
- }
-
- if (!this.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- if (this.width > Image.MAX_RESIZE_WIDTH || this.height > Image.MAX_RESIZE_HEIGHT) {
- throw new x.ImageError(x.ImageError.MAX_RESOLUTION_ERR);
- }
-
- type = options.type || this.type || 'image/jpeg';
- quality = options.quality || 90;
- crop = Basic.typeOf(options.crop) !== 'undefined' ? options.crop : false;
-
- // figure out dimensions for the thumb
- if (options.width) {
- width = options.width;
- height = options.height || width;
- } else {
- // if container element has > 0 dimensions, take them
- var dimensions = Dom.getSize(el);
- if (dimensions.w && dimensions.h) { // both should be > 0
- width = dimensions.w;
- height = dimensions.h;
- }
- }
-
- imgCopy = new Image();
-
- imgCopy.bind("Resize", function() {
- onResize.call(self);
- });
-
- imgCopy.bind("Load", function() {
- imgCopy.downsize(width, height, crop, false);
- });
-
- imgCopy.clone(this, false);
-
- return imgCopy;
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex);
- }
- },
-
- /**
- Properly destroys the image and frees resources in use. If any. Recommended way to dispose mOxie.Image object.
-
- @method destroy
- */
- destroy: function() {
- if (this.ruid) {
- this.getRuntime().exec.call(this, 'Image', 'destroy');
- this.disconnectRuntime();
- }
- this.unbindAll();
- }
- });
-
-
- function _updateInfo(info) {
- if (!info) {
- info = this.getRuntime().exec.call(this, 'Image', 'getInfo');
- }
-
- this.size = info.size;
- this.width = info.width;
- this.height = info.height;
- this.type = info.type;
- this.meta = info.meta;
-
- // update file name, only if empty
- if (this.name === '') {
- this.name = info.name;
- }
- }
-
-
- function _load(src) {
- var srcType = Basic.typeOf(src);
-
- try {
- // if source is Image
- if (src instanceof Image) {
- if (!src.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
- _loadFromImage.apply(this, arguments);
- }
- // if source is o.Blob/o.File
- else if (src instanceof Blob) {
- if (!~Basic.inArray(src.type, ['image/jpeg', 'image/png'])) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
- _loadFromBlob.apply(this, arguments);
- }
- // if native blob/file
- else if (Basic.inArray(srcType, ['blob', 'file']) !== -1) {
- _load.call(this, new File(null, src), arguments[1]);
- }
- // if String
- else if (srcType === 'string') {
- // if dataUrl String
- if (/^data:[^;]*;base64,/.test(src)) {
- _load.call(this, new Blob(null, { data: src }), arguments[1]);
- }
- // else assume Url, either relative or absolute
- else {
- _loadFromUrl.apply(this, arguments);
- }
- }
- // if source seems to be an img node
- else if (srcType === 'node' && src.nodeName.toLowerCase() === 'img') {
- _load.call(this, src.src, arguments[1]);
- }
- else {
- throw new x.DOMException(x.DOMException.TYPE_MISMATCH_ERR);
- }
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex);
- }
- }
-
-
- function _loadFromImage(img, exact) {
- var runtime = this.connectRuntime(img.ruid);
- this.ruid = runtime.uid;
- runtime.exec.call(this, 'Image', 'loadFromImage', img, (Basic.typeOf(exact) === 'undefined' ? true : exact));
- }
-
-
- function _loadFromBlob(blob, options) {
- var self = this;
-
- self.name = blob.name || '';
-
- function exec(runtime) {
- self.ruid = runtime.uid;
- runtime.exec.call(self, 'Image', 'loadFromBlob', blob);
- }
-
- if (blob.isDetached()) {
- this.bind('RuntimeInit', function(e, runtime) {
- exec(runtime);
- });
-
- // convert to object representation
- if (options && typeof(options.required_caps) === 'string') {
- options.required_caps = Runtime.parseCaps(options.required_caps);
- }
-
- this.connectRuntime(Basic.extend({
- required_caps: {
- access_image_binary: true,
- resize_image: true
- }
- }, options));
- } else {
- exec(this.connectRuntime(blob.ruid));
- }
- }
-
-
- function _loadFromUrl(url, options) {
- var self = this, xhr;
-
- xhr = new XMLHttpRequest();
-
- xhr.open('get', url);
- xhr.responseType = 'blob';
-
- xhr.onprogress = function(e) {
- self.trigger(e);
- };
-
- xhr.onload = function() {
- _loadFromBlob.call(self, xhr.response, true);
- };
-
- xhr.onerror = function(e) {
- self.trigger(e);
- };
-
- xhr.onloadend = function() {
- xhr.destroy();
- };
-
- xhr.bind('RuntimeError', function(e, err) {
- self.trigger('RuntimeError', err);
- });
-
- xhr.send(null, options);
- }
- }
-
- // virtual world will crash on you if image has a resolution higher than this:
- Image.MAX_RESIZE_WIDTH = 6500;
- Image.MAX_RESIZE_HEIGHT = 6500;
-
- Image.prototype = EventTarget.instance;
-
- return Image;
-});
-
-// Included from: src/javascript/runtime/html5/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global File:true */
-
-/**
-Defines constructor for HTML5 runtime.
-
-@class moxie/runtime/html5/Runtime
-@private
-*/
-define("moxie/runtime/html5/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime",
- "moxie/core/utils/Env"
-], function(Basic, x, Runtime, Env) {
-
- var type = "html5", extensions = {};
-
- function Html5Runtime(options) {
- var I = this
- , Test = Runtime.capTest
- , True = Runtime.capTrue
- ;
-
- var caps = Basic.extend({
- access_binary: Test(window.FileReader || window.File && window.File.getAsDataURL),
- access_image_binary: function() {
- return I.can('access_binary') && !!extensions.Image;
- },
- display_media: Test(Env.can('create_canvas') || Env.can('use_data_uri_over32kb')),
- do_cors: Test(window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()),
- drag_and_drop: Test(function() {
- // this comes directly from Modernizr: http://www.modernizr.com/
- var div = document.createElement('div');
- // IE has support for drag and drop since version 5, but doesn't support dropping files from desktop
- return (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) && (Env.browser !== 'IE' || Env.version > 9);
- }()),
- filter_by_extension: Test(function() { // if you know how to feature-detect this, please suggest
- return (Env.browser === 'Chrome' && Env.version >= 28) || (Env.browser === 'IE' && Env.version >= 10);
- }()),
- return_response_headers: True,
- return_response_type: function(responseType) {
- if (responseType === 'json' && !!window.JSON) { // we can fake this one even if it's not supported
- return true;
- }
- return Env.can('return_response_type', responseType);
- },
- return_status_code: True,
- report_upload_progress: Test(window.XMLHttpRequest && new XMLHttpRequest().upload),
- resize_image: function() {
- return I.can('access_binary') && Env.can('create_canvas');
- },
- select_file: function() {
- return Env.can('use_fileinput') && window.File;
- },
- select_folder: function() {
- return I.can('select_file') && Env.browser === 'Chrome' && Env.version >= 21;
- },
- select_multiple: function() {
- // it is buggy on Safari Windows and iOS
- return I.can('select_file') &&
- !(Env.browser === 'Safari' && Env.os === 'Windows') &&
- !(Env.os === 'iOS' && Env.verComp(Env.osVersion, "7.0.4", '<'));
- },
- send_binary_string: Test(window.XMLHttpRequest && (new XMLHttpRequest().sendAsBinary || (window.Uint8Array && window.ArrayBuffer))),
- send_custom_headers: Test(window.XMLHttpRequest),
- send_multipart: function() {
- return !!(window.XMLHttpRequest && new XMLHttpRequest().upload && window.FormData) || I.can('send_binary_string');
- },
- slice_blob: Test(window.File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice)),
- stream_upload: function(){
- return I.can('slice_blob') && I.can('send_multipart');
- },
- summon_file_dialog: Test(function() { // yeah... some dirty sniffing here...
- return (Env.browser === 'Firefox' && Env.version >= 4) ||
- (Env.browser === 'Opera' && Env.version >= 12) ||
- (Env.browser === 'IE' && Env.version >= 10) ||
- !!~Basic.inArray(Env.browser, ['Chrome', 'Safari']);
- }()),
- upload_filesize: True
- },
- arguments[2]
- );
-
- Runtime.call(this, options, (arguments[1] || type), caps);
-
-
- Basic.extend(this, {
-
- init : function() {
- this.trigger("Init");
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- destroy = I = null;
- };
- }(this.destroy))
- });
-
- Basic.extend(this.getShim(), extensions);
- }
-
- Runtime.addConstructor(type, Html5Runtime);
-
- return extensions;
-});
-
-// Included from: src/javascript/runtime/html5/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/Blob
-@private
-*/
-define("moxie/runtime/html5/file/Blob", [
- "moxie/runtime/html5/Runtime",
- "moxie/file/Blob"
-], function(extensions, Blob) {
-
- function HTML5Blob() {
- function w3cBlobSlice(blob, start, end) {
- var blobSlice;
-
- if (window.File.prototype.slice) {
- try {
- blob.slice(); // depricated version will throw WRONG_ARGUMENTS_ERR exception
- return blob.slice(start, end);
- } catch (e) {
- // depricated slice method
- return blob.slice(start, end - start);
- }
- // slice method got prefixed: https://bugzilla.mozilla.org/show_bug.cgi?id=649672
- } else if ((blobSlice = window.File.prototype.webkitSlice || window.File.prototype.mozSlice)) {
- return blobSlice.call(blob, start, end);
- } else {
- return null; // or throw some exception
- }
- }
-
- this.slice = function() {
- return new Blob(this.getRuntime().uid, w3cBlobSlice.apply(this, arguments));
- };
- }
-
- return (extensions.Blob = HTML5Blob);
-});
-
-// Included from: src/javascript/core/utils/Events.js
-
-/**
- * Events.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Events', [
- 'moxie/core/utils/Basic'
-], function(Basic) {
- var eventhash = {}, uid = 'moxie_' + Basic.guid();
-
- // IE W3C like event funcs
- function preventDefault() {
- this.returnValue = false;
- }
-
- function stopPropagation() {
- this.cancelBubble = true;
- }
-
- /**
- Adds an event handler to the specified object and store reference to the handler
- in objects internal Plupload registry (@see removeEvent).
-
- @method addEvent
- @for Utils
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Name to add event listener to.
- @param {Function} callback Function to call when event occurs.
- @param {String} [key] that might be used to add specifity to the event record.
- */
- var addEvent = function(obj, name, callback, key) {
- var func, events;
-
- name = name.toLowerCase();
-
- // Add event listener
- if (obj.addEventListener) {
- func = callback;
-
- obj.addEventListener(name, func, false);
- } else if (obj.attachEvent) {
- func = function() {
- var evt = window.event;
-
- if (!evt.target) {
- evt.target = evt.srcElement;
- }
-
- evt.preventDefault = preventDefault;
- evt.stopPropagation = stopPropagation;
-
- callback(evt);
- };
-
- obj.attachEvent('on' + name, func);
- }
-
- // Log event handler to objects internal mOxie registry
- if (!obj[uid]) {
- obj[uid] = Basic.guid();
- }
-
- if (!eventhash.hasOwnProperty(obj[uid])) {
- eventhash[obj[uid]] = {};
- }
-
- events = eventhash[obj[uid]];
-
- if (!events.hasOwnProperty(name)) {
- events[name] = [];
- }
-
- events[name].push({
- func: func,
- orig: callback, // store original callback for IE
- key: key
- });
- };
-
-
- /**
- Remove event handler from the specified object. If third argument (callback)
- is not specified remove all events with the specified name.
-
- @method removeEvent
- @static
- @param {Object} obj DOM element to remove event listener(s) from.
- @param {String} name Name of event listener to remove.
- @param {Function|String} [callback] might be a callback or unique key to match.
- */
- var removeEvent = function(obj, name, callback) {
- var type, undef;
-
- name = name.toLowerCase();
-
- if (obj[uid] && eventhash[obj[uid]] && eventhash[obj[uid]][name]) {
- type = eventhash[obj[uid]][name];
- } else {
- return;
- }
-
- for (var i = type.length - 1; i >= 0; i--) {
- // undefined or not, key should match
- if (type[i].orig === callback || type[i].key === callback) {
- if (obj.removeEventListener) {
- obj.removeEventListener(name, type[i].func, false);
- } else if (obj.detachEvent) {
- obj.detachEvent('on'+name, type[i].func);
- }
-
- type[i].orig = null;
- type[i].func = null;
- type.splice(i, 1);
-
- // If callback was passed we are done here, otherwise proceed
- if (callback !== undef) {
- break;
- }
- }
- }
-
- // If event array got empty, remove it
- if (!type.length) {
- delete eventhash[obj[uid]][name];
- }
-
- // If mOxie registry has become empty, remove it
- if (Basic.isEmptyObj(eventhash[obj[uid]])) {
- delete eventhash[obj[uid]];
-
- // IE doesn't let you remove DOM object property with - delete
- try {
- delete obj[uid];
- } catch(e) {
- obj[uid] = undef;
- }
- }
- };
-
-
- /**
- Remove all kind of events from the specified object
-
- @method removeAllEvents
- @static
- @param {Object} obj DOM element to remove event listeners from.
- @param {String} [key] unique key to match, when removing events.
- */
- var removeAllEvents = function(obj, key) {
- if (!obj || !obj[uid]) {
- return;
- }
-
- Basic.each(eventhash[obj[uid]], function(events, name) {
- removeEvent(obj, name, key);
- });
- };
-
- return {
- addEvent: addEvent,
- removeEvent: removeEvent,
- removeAllEvents: removeAllEvents
- };
-});
-
-// Included from: src/javascript/runtime/html5/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileInput
-@private
-*/
-define("moxie/runtime/html5/file/FileInput", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, Basic, Dom, Events, Mime, Env) {
-
- function FileInput() {
- var _files = [], _options;
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, I = comp.getRuntime(), input, shimContainer, mimes, browseButton, zIndex, top;
-
- _options = options;
- _files = [];
-
- // figure out accept string
- mimes = _options.accept.mimes || Mime.extList2mimes(_options.accept, I.can('filter_by_extension'));
-
- shimContainer = I.getShimContainer();
-
- shimContainer.innerHTML = ' ';
-
- input = Dom.get(I.uid);
-
- // prepare file input to be placed underneath the browse_button element
- Basic.extend(input.style, {
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
-
- browseButton = Dom.get(_options.browse_button);
-
- // Route click event to the input[type=file] element for browsers that support such behavior
- if (I.can('summon_file_dialog')) {
- if (Dom.getStyle(browseButton, 'position') === 'static') {
- browseButton.style.position = 'relative';
- }
-
- zIndex = parseInt(Dom.getStyle(browseButton, 'z-index'), 10) || 1;
-
- browseButton.style.zIndex = zIndex;
- shimContainer.style.zIndex = zIndex - 1;
-
- Events.addEvent(browseButton, 'click', function(e) {
- var input = Dom.get(I.uid);
- if (input && !input.disabled) { // for some reason FF (up to 8.0.1 so far) lets to click disabled input[type=file]
- input.click();
- }
- e.preventDefault();
- }, comp.uid);
- }
-
- /* Since we have to place input[type=file] on top of the browse_button for some browsers,
- browse_button loses interactivity, so we restore it here */
- top = I.can('summon_file_dialog') ? browseButton : shimContainer;
-
- Events.addEvent(top, 'mouseover', function() {
- comp.trigger('mouseenter');
- }, comp.uid);
-
- Events.addEvent(top, 'mouseout', function() {
- comp.trigger('mouseleave');
- }, comp.uid);
-
- Events.addEvent(top, 'mousedown', function() {
- comp.trigger('mousedown');
- }, comp.uid);
-
- Events.addEvent(Dom.get(_options.container), 'mouseup', function() {
- comp.trigger('mouseup');
- }, comp.uid);
-
-
- input.onchange = function onChange() { // there should be only one handler for this
- _files = [];
-
- if (_options.directory) {
- // folders are represented by dots, filter them out (Chrome 11+)
- Basic.each(this.files, function(file) {
- if (file.name !== ".") { // if it doesn't looks like a folder
- _files.push(file);
- }
- });
- } else {
- _files = [].slice.call(this.files);
- }
-
- // clearing the value enables the user to select the same file again if they want to
- if (Env.browser !== 'IE') {
- this.value = '';
- } else {
- // in IE input[type="file"] is read-only so the only way to reset it is to re-insert it
- var clone = this.cloneNode(true);
- this.parentNode.replaceChild(clone, this);
- clone.onchange = onChange;
- }
- comp.trigger('change');
- };
-
- // ready event is perfectly asynchronous
- comp.trigger({
- type: 'ready',
- async: true
- });
-
- shimContainer = null;
- },
-
- getFiles: function() {
- return _files;
- },
-
- disable: function(state) {
- var I = this.getRuntime(), input;
-
- if ((input = Dom.get(I.uid))) {
- input.disabled = !!state;
- }
- },
-
- destroy: function() {
- var I = this.getRuntime()
- , shim = I.getShim()
- , shimContainer = I.getShimContainer()
- ;
-
- Events.removeAllEvents(shimContainer, this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.browse_button), this.uid);
-
- if (shimContainer) {
- shimContainer.innerHTML = '';
- }
-
- shim.removeInstance(this.uid);
-
- _files = _options = shimContainer = shim = null;
- }
- });
- }
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/html5/file/FileDrop.js
-
-/**
- * FileDrop.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileDrop
-@private
-*/
-define("moxie/runtime/html5/file/FileDrop", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime"
-], function(extensions, Basic, Dom, Events, Mime) {
-
- function FileDrop() {
- var _files = [], _allowedExts = [], _options;
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, dropZone;
-
- _options = options;
- _allowedExts = _extractExts(_options.accept);
- dropZone = _options.container;
-
- Events.addEvent(dropZone, 'dragover', function(e) {
- e.preventDefault();
- e.stopPropagation();
- e.dataTransfer.dropEffect = 'copy';
- }, comp.uid);
-
- Events.addEvent(dropZone, 'drop', function(e) {
- e.preventDefault();
- e.stopPropagation();
-
- _files = [];
-
- // Chrome 21+ accepts folders via Drag'n'Drop
- if (e.dataTransfer.items && e.dataTransfer.items[0].webkitGetAsEntry) {
- _readItems(e.dataTransfer.items, function() {
- comp.trigger("drop");
- });
- } else {
- Basic.each(e.dataTransfer.files, function(file) {
- if (_isAcceptable(file)) {
- _files.push(file);
- }
- });
- comp.trigger("drop");
- }
- }, comp.uid);
-
- Events.addEvent(dropZone, 'dragenter', function(e) {
- e.preventDefault();
- e.stopPropagation();
- comp.trigger("dragenter");
- }, comp.uid);
-
- Events.addEvent(dropZone, 'dragleave', function(e) {
- e.preventDefault();
- e.stopPropagation();
- comp.trigger("dragleave");
- }, comp.uid);
- },
-
- getFiles: function() {
- return _files;
- },
-
- destroy: function() {
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- _files = _allowedExts = _options = null;
- }
- });
-
-
- function _extractExts(accept) {
- var exts = [];
- for (var i = 0; i < accept.length; i++) {
- [].push.apply(exts, accept[i].extensions.split(/\s*,\s*/));
- }
- return Basic.inArray('*', exts) === -1 ? exts : [];
- }
-
-
- function _isAcceptable(file) {
- var ext = Mime.getFileExtension(file.name);
- return !ext || !_allowedExts.length || Basic.inArray(ext, _allowedExts) !== -1;
- }
-
-
- function _readItems(items, cb) {
- var entries = [];
- Basic.each(items, function(item) {
- var entry = item.webkitGetAsEntry();
- // Address #998 (https://code.google.com/p/chromium/issues/detail?id=332579)
- if (entry) {
- // file() fails on OSX when the filename contains a special character (e.g. umlaut): see #61
- if (entry.isFile) {
- var file = item.getAsFile();
- if (_isAcceptable(file)) {
- _files.push(file);
- }
- } else {
- entries.push(entry);
- }
- }
- });
-
- if (entries.length) {
- _readEntries(entries, cb);
- } else {
- cb();
- }
- }
-
-
- function _readEntries(entries, cb) {
- var queue = [];
- Basic.each(entries, function(entry) {
- queue.push(function(cbcb) {
- _readEntry(entry, cbcb);
- });
- });
- Basic.inSeries(queue, function() {
- cb();
- });
- }
-
- function _readEntry(entry, cb) {
- if (entry.isFile) {
- entry.file(function(file) {
- if (_isAcceptable(file)) {
- _files.push(file);
- }
- cb();
- }, function() {
- // fire an error event maybe
- cb();
- });
- } else if (entry.isDirectory) {
- _readDirEntry(entry, cb);
- } else {
- cb(); // not file, not directory? what then?..
- }
- }
-
- function _readDirEntry(dirEntry, cb) {
- var entries = [], dirReader = dirEntry.createReader();
-
- // keep quering recursively till no more entries
- function getEntries(cbcb) {
- dirReader.readEntries(function(moreEntries) {
- if (moreEntries.length) {
- [].push.apply(entries, moreEntries);
- getEntries(cbcb);
- } else {
- cbcb();
- }
- }, cbcb);
- }
-
- // ...and you thought FileReader was crazy...
- getEntries(function() {
- _readEntries(entries, cb);
- });
- }
- }
-
- return (extensions.FileDrop = FileDrop);
-});
-
-// Included from: src/javascript/runtime/html5/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileReader
-@private
-*/
-define("moxie/runtime/html5/file/FileReader", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Encode",
- "moxie/core/utils/Basic"
-], function(extensions, Encode, Basic) {
-
- function FileReader() {
- var _fr, _convertToBinary = false;
-
- Basic.extend(this, {
-
- read: function(op, blob) {
- var target = this;
-
- _fr = new window.FileReader();
-
- _fr.addEventListener('progress', function(e) {
- target.trigger(e);
- });
-
- _fr.addEventListener('load', function(e) {
- target.trigger(e);
- });
-
- _fr.addEventListener('error', function(e) {
- target.trigger(e, _fr.error);
- });
-
- _fr.addEventListener('loadend', function() {
- _fr = null;
- });
-
- if (Basic.typeOf(_fr[op]) === 'function') {
- _convertToBinary = false;
- _fr[op](blob.getSource());
- } else if (op === 'readAsBinaryString') { // readAsBinaryString is depricated in general and never existed in IE10+
- _convertToBinary = true;
- _fr.readAsDataURL(blob.getSource());
- }
- },
-
- getResult: function() {
- return _fr && _fr.result ? (_convertToBinary ? _toBinary(_fr.result) : _fr.result) : null;
- },
-
- abort: function() {
- if (_fr) {
- _fr.abort();
- }
- },
-
- destroy: function() {
- _fr = null;
- }
- });
-
- function _toBinary(str) {
- return Encode.atob(str.substring(str.indexOf('base64,') + 7));
- }
- }
-
- return (extensions.FileReader = FileReader);
-});
-
-// Included from: src/javascript/runtime/html5/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global ActiveXObject:true */
-
-/**
-@class moxie/runtime/html5/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/html5/xhr/XMLHttpRequest", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Url",
- "moxie/file/File",
- "moxie/file/Blob",
- "moxie/xhr/FormData",
- "moxie/core/Exceptions",
- "moxie/core/utils/Env"
-], function(extensions, Basic, Mime, Url, File, Blob, FormData, x, Env) {
-
- function XMLHttpRequest() {
- var self = this
- , _xhr
- , _filename
- ;
-
- Basic.extend(this, {
- send: function(meta, data) {
- var target = this
- , isGecko2_5_6 = (Env.browser === 'Mozilla' && Env.version >= 4 && Env.version < 7)
- , isAndroidBrowser = Env.browser === 'Android Browser'
- , mustSendAsBinary = false
- ;
-
- // extract file name
- _filename = meta.url.replace(/^.+?\/([\w\-\.]+)$/, '$1').toLowerCase();
-
- _xhr = _getNativeXHR();
- _xhr.open(meta.method, meta.url, meta.async, meta.user, meta.password);
-
-
- // prepare data to be sent
- if (data instanceof Blob) {
- if (data.isDetached()) {
- mustSendAsBinary = true;
- }
- data = data.getSource();
- } else if (data instanceof FormData) {
-
- if (data.hasBlob()) {
- if (data.getBlob().isDetached()) {
- data = _prepareMultipart.call(target, data); // _xhr must be instantiated and be in OPENED state
- mustSendAsBinary = true;
- } else if ((isGecko2_5_6 || isAndroidBrowser) && Basic.typeOf(data.getBlob().getSource()) === 'blob' && window.FileReader) {
- // Gecko 2/5/6 can't send blob in FormData: https://bugzilla.mozilla.org/show_bug.cgi?id=649150
- // Android browsers (default one and Dolphin) seem to have the same issue, see: #613
- _preloadAndSend.call(target, meta, data);
- return; // _preloadAndSend will reinvoke send() with transmutated FormData =%D
- }
- }
-
- // transfer fields to real FormData
- if (data instanceof FormData) { // if still a FormData, e.g. not mangled by _prepareMultipart()
- var fd = new window.FormData();
- data.each(function(value, name) {
- if (value instanceof Blob) {
- fd.append(name, value.getSource());
- } else {
- fd.append(name, value);
- }
- });
- data = fd;
- }
- }
-
-
- // if XHR L2
- if (_xhr.upload) {
- if (meta.withCredentials) {
- _xhr.withCredentials = true;
- }
-
- _xhr.addEventListener('load', function(e) {
- target.trigger(e);
- });
-
- _xhr.addEventListener('error', function(e) {
- target.trigger(e);
- });
-
- // additionally listen to progress events
- _xhr.addEventListener('progress', function(e) {
- target.trigger(e);
- });
-
- _xhr.upload.addEventListener('progress', function(e) {
- target.trigger({
- type: 'UploadProgress',
- loaded: e.loaded,
- total: e.total
- });
- });
- // ... otherwise simulate XHR L2
- } else {
- _xhr.onreadystatechange = function onReadyStateChange() {
-
- // fake Level 2 events
- switch (_xhr.readyState) {
-
- case 1: // XMLHttpRequest.OPENED
- // readystatechanged is fired twice for OPENED state (in IE and Mozilla) - neu
- break;
-
- // looks like HEADERS_RECEIVED (state 2) is not reported in Opera (or it's old versions) - neu
- case 2: // XMLHttpRequest.HEADERS_RECEIVED
- break;
-
- case 3: // XMLHttpRequest.LOADING
- // try to fire progress event for not XHR L2
- var total, loaded;
-
- try {
- if (Url.hasSameOrigin(meta.url)) { // Content-Length not accessible for cross-domain on some browsers
- total = _xhr.getResponseHeader('Content-Length') || 0; // old Safari throws an exception here
- }
-
- if (_xhr.responseText) { // responseText was introduced in IE7
- loaded = _xhr.responseText.length;
- }
- } catch(ex) {
- total = loaded = 0;
- }
-
- target.trigger({
- type: 'progress',
- lengthComputable: !!total,
- total: parseInt(total, 10),
- loaded: loaded
- });
- break;
-
- case 4: // XMLHttpRequest.DONE
- // release readystatechange handler (mostly for IE)
- _xhr.onreadystatechange = function() {};
-
- // usually status 0 is returned when server is unreachable, but FF also fails to status 0 for 408 timeout
- if (_xhr.status === 0) {
- target.trigger('error');
- } else {
- target.trigger('load');
- }
- break;
- }
- };
- }
-
-
- // set request headers
- if (!Basic.isEmptyObj(meta.headers)) {
- Basic.each(meta.headers, function(value, header) {
- _xhr.setRequestHeader(header, value);
- });
- }
-
- // request response type
- if ("" !== meta.responseType && 'responseType' in _xhr) {
- if ('json' === meta.responseType && !Env.can('return_response_type', 'json')) { // we can fake this one
- _xhr.responseType = 'text';
- } else {
- _xhr.responseType = meta.responseType;
- }
- }
-
- // send ...
- if (!mustSendAsBinary) {
- _xhr.send(data);
- } else {
- if (_xhr.sendAsBinary) { // Gecko
- _xhr.sendAsBinary(data);
- } else { // other browsers having support for typed arrays
- (function() {
- // mimic Gecko's sendAsBinary
- var ui8a = new Uint8Array(data.length);
- for (var i = 0; i < data.length; i++) {
- ui8a[i] = (data.charCodeAt(i) & 0xff);
- }
- _xhr.send(ui8a.buffer);
- }());
- }
- }
-
- target.trigger('loadstart');
- },
-
- getStatus: function() {
- // according to W3C spec it should return 0 for readyState < 3, but instead it throws an exception
- try {
- if (_xhr) {
- return _xhr.status;
- }
- } catch(ex) {}
- return 0;
- },
-
- getResponse: function(responseType) {
- var I = this.getRuntime();
-
- try {
- switch (responseType) {
- case 'blob':
- var file = new File(I.uid, _xhr.response);
-
- // try to extract file name from content-disposition if possible (might be - not, if CORS for example)
- var disposition = _xhr.getResponseHeader('Content-Disposition');
- if (disposition) {
- // extract filename from response header if available
- var match = disposition.match(/filename=([\'\"'])([^\1]+)\1/);
- if (match) {
- _filename = match[2];
- }
- }
- file.name = _filename;
-
- // pre-webkit Opera doesn't set type property on the blob response
- if (!file.type) {
- file.type = Mime.getFileMime(_filename);
- }
- return file;
-
- case 'json':
- if (!Env.can('return_response_type', 'json')) {
- return _xhr.status === 200 && !!window.JSON ? JSON.parse(_xhr.responseText) : null;
- }
- return _xhr.response;
-
- case 'document':
- return _getDocument(_xhr);
-
- default:
- return _xhr.responseText !== '' ? _xhr.responseText : null; // against the specs, but for consistency across the runtimes
- }
- } catch(ex) {
- return null;
- }
- },
-
- getAllResponseHeaders: function() {
- try {
- return _xhr.getAllResponseHeaders();
- } catch(ex) {}
- return '';
- },
-
- abort: function() {
- if (_xhr) {
- _xhr.abort();
- }
- },
-
- destroy: function() {
- self = _filename = null;
- }
- });
-
-
- // here we go... ugly fix for ugly bug
- function _preloadAndSend(meta, data) {
- var target = this, blob, fr;
-
- // get original blob
- blob = data.getBlob().getSource();
-
- // preload blob in memory to be sent as binary string
- fr = new window.FileReader();
- fr.onload = function() {
- // overwrite original blob
- data.append(data.getBlobName(), new Blob(null, {
- type: blob.type,
- data: fr.result
- }));
- // invoke send operation again
- self.send.call(target, meta, data);
- };
- fr.readAsBinaryString(blob);
- }
-
-
- function _getNativeXHR() {
- if (window.XMLHttpRequest && !(Env.browser === 'IE' && Env.version < 8)) { // IE7 has native XHR but it's buggy
- return new window.XMLHttpRequest();
- } else {
- return (function() {
- var progIDs = ['Msxml2.XMLHTTP.6.0', 'Microsoft.XMLHTTP']; // if 6.0 available, use it, otherwise failback to default 3.0
- for (var i = 0; i < progIDs.length; i++) {
- try {
- return new ActiveXObject(progIDs[i]);
- } catch (ex) {}
- }
- })();
- }
- }
-
- // @credits Sergey Ilinsky (http://www.ilinsky.com/)
- function _getDocument(xhr) {
- var rXML = xhr.responseXML;
- var rText = xhr.responseText;
-
- // Try parsing responseText (@see: http://www.ilinsky.com/articles/XMLHttpRequest/#bugs-ie-responseXML-content-type)
- if (Env.browser === 'IE' && rText && rXML && !rXML.documentElement && /[^\/]+\/[^\+]+\+xml/.test(xhr.getResponseHeader("Content-Type"))) {
- rXML = new window.ActiveXObject("Microsoft.XMLDOM");
- rXML.async = false;
- rXML.validateOnParse = false;
- rXML.loadXML(rText);
- }
-
- // Check if there is no error in document
- if (rXML) {
- if ((Env.browser === 'IE' && rXML.parseError !== 0) || !rXML.documentElement || rXML.documentElement.tagName === "parsererror") {
- return null;
- }
- }
- return rXML;
- }
-
-
- function _prepareMultipart(fd) {
- var boundary = '----moxieboundary' + new Date().getTime()
- , dashdash = '--'
- , crlf = '\r\n'
- , multipart = ''
- , I = this.getRuntime()
- ;
-
- if (!I.can('send_binary_string')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- _xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
-
- // append multipart parameters
- fd.each(function(value, name) {
- // Firefox 3.6 failed to convert multibyte characters to UTF-8 in sendAsBinary(),
- // so we try it here ourselves with: unescape(encodeURIComponent(value))
- if (value instanceof Blob) {
- // Build RFC2388 blob
- multipart += dashdash + boundary + crlf +
- 'Content-Disposition: form-data; name="' + name + '"; filename="' + unescape(encodeURIComponent(value.name || 'blob')) + '"' + crlf +
- 'Content-Type: ' + (value.type || 'application/octet-stream') + crlf + crlf +
- value.getSource() + crlf;
- } else {
- multipart += dashdash + boundary + crlf +
- 'Content-Disposition: form-data; name="' + name + '"' + crlf + crlf +
- unescape(encodeURIComponent(value)) + crlf;
- }
- });
-
- multipart += dashdash + boundary + dashdash + crlf;
-
- return multipart;
- }
- }
-
- return (extensions.XMLHttpRequest = XMLHttpRequest);
-});
-
-// Included from: src/javascript/runtime/html5/utils/BinaryReader.js
-
-/**
- * BinaryReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/utils/BinaryReader
-@private
-*/
-define("moxie/runtime/html5/utils/BinaryReader", [], function() {
- return function() {
- var II = false, bin;
-
- // Private functions
- function read(idx, size) {
- var mv = II ? 0 : -8 * (size - 1), sum = 0, i;
-
- for (i = 0; i < size; i++) {
- sum |= (bin.charCodeAt(idx + i) << Math.abs(mv + i*8));
- }
-
- return sum;
- }
-
- function putstr(segment, idx, length) {
- length = arguments.length === 3 ? length : bin.length - idx - 1;
- bin = bin.substr(0, idx) + segment + bin.substr(length + idx);
- }
-
- function write(idx, num, size) {
- var str = '', mv = II ? 0 : -8 * (size - 1), i;
-
- for (i = 0; i < size; i++) {
- str += String.fromCharCode((num >> Math.abs(mv + i*8)) & 255);
- }
-
- putstr(str, idx, size);
- }
-
- // Public functions
- return {
- II: function(order) {
- if (order === undefined) {
- return II;
- } else {
- II = order;
- }
- },
-
- init: function(binData) {
- II = false;
- bin = binData;
- },
-
- SEGMENT: function(idx, length, segment) {
- switch (arguments.length) {
- case 1:
- return bin.substr(idx, bin.length - idx - 1);
- case 2:
- return bin.substr(idx, length);
- case 3:
- putstr(segment, idx, length);
- break;
- default: return bin;
- }
- },
-
- BYTE: function(idx) {
- return read(idx, 1);
- },
-
- SHORT: function(idx) {
- return read(idx, 2);
- },
-
- LONG: function(idx, num) {
- if (num === undefined) {
- return read(idx, 4);
- } else {
- write(idx, num, 4);
- }
- },
-
- SLONG: function(idx) { // 2's complement notation
- var num = read(idx, 4);
-
- return (num > 2147483647 ? num - 4294967296 : num);
- },
-
- STRING: function(idx, size) {
- var str = '';
-
- for (size += idx; idx < size; idx++) {
- str += String.fromCharCode(read(idx, 1));
- }
-
- return str;
- }
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/JPEGHeaders.js
-
-/**
- * JPEGHeaders.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/JPEGHeaders
-@private
-*/
-define("moxie/runtime/html5/image/JPEGHeaders", [
- "moxie/runtime/html5/utils/BinaryReader"
-], function(BinaryReader) {
-
- return function JPEGHeaders(data) {
- var headers = [], read, idx, marker, length = 0;
-
- read = new BinaryReader();
- read.init(data);
-
- // Check if data is jpeg
- if (read.SHORT(0) !== 0xFFD8) {
- return;
- }
-
- idx = 2;
-
- while (idx <= data.length) {
- marker = read.SHORT(idx);
-
- // omit RST (restart) markers
- if (marker >= 0xFFD0 && marker <= 0xFFD7) {
- idx += 2;
- continue;
- }
-
- // no headers allowed after SOS marker
- if (marker === 0xFFDA || marker === 0xFFD9) {
- break;
- }
-
- length = read.SHORT(idx + 2) + 2;
-
- // APPn marker detected
- if (marker >= 0xFFE1 && marker <= 0xFFEF) {
- headers.push({
- hex: marker,
- name: 'APP' + (marker & 0x000F),
- start: idx,
- length: length,
- segment: read.SEGMENT(idx, length)
- });
- }
-
- idx += length;
- }
-
- read.init(null); // free memory
-
- return {
- headers: headers,
-
- restore: function(data) {
- var max, i;
-
- read.init(data);
-
- idx = read.SHORT(2) == 0xFFE0 ? 4 + read.SHORT(4) : 2;
-
- for (i = 0, max = headers.length; i < max; i++) {
- read.SEGMENT(idx, 0, headers[i].segment);
- idx += headers[i].length;
- }
-
- data = read.SEGMENT();
- read.init(null);
- return data;
- },
-
- strip: function(data) {
- var headers, jpegHeaders, i;
-
- jpegHeaders = new JPEGHeaders(data);
- headers = jpegHeaders.headers;
- jpegHeaders.purge();
-
- read.init(data);
-
- i = headers.length;
- while (i--) {
- read.SEGMENT(headers[i].start, headers[i].length, '');
- }
-
- data = read.SEGMENT();
- read.init(null);
- return data;
- },
-
- get: function(name) {
- var array = [];
-
- for (var i = 0, max = headers.length; i < max; i++) {
- if (headers[i].name === name.toUpperCase()) {
- array.push(headers[i].segment);
- }
- }
- return array;
- },
-
- set: function(name, segment) {
- var array = [], i, ii, max;
-
- if (typeof(segment) === 'string') {
- array.push(segment);
- } else {
- array = segment;
- }
-
- for (i = ii = 0, max = headers.length; i < max; i++) {
- if (headers[i].name === name.toUpperCase()) {
- headers[i].segment = array[ii];
- headers[i].length = array[ii].length;
- ii++;
- }
- if (ii >= array.length) {
- break;
- }
- }
- },
-
- purge: function() {
- headers = [];
- read.init(null);
- read = null;
- }
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/ExifParser.js
-
-/**
- * ExifParser.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/ExifParser
-@private
-*/
-define("moxie/runtime/html5/image/ExifParser", [
- "moxie/core/utils/Basic",
- "moxie/runtime/html5/utils/BinaryReader"
-], function(Basic, BinaryReader) {
-
- return function ExifParser() {
- // Private ExifParser fields
- var data, tags, Tiff, offsets = {}, tagDescs;
-
- data = new BinaryReader();
-
- tags = {
- tiff : {
- /*
- The image orientation viewed in terms of rows and columns.
-
- 1 = The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.
- 2 = The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.
- 3 = The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.
- 4 = The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.
- 5 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.
- 6 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
- 7 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.
- 8 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.
- */
- 0x0112: 'Orientation',
- 0x010E: 'ImageDescription',
- 0x010F: 'Make',
- 0x0110: 'Model',
- 0x0131: 'Software',
- 0x8769: 'ExifIFDPointer',
- 0x8825: 'GPSInfoIFDPointer'
- },
- exif : {
- 0x9000: 'ExifVersion',
- 0xA001: 'ColorSpace',
- 0xA002: 'PixelXDimension',
- 0xA003: 'PixelYDimension',
- 0x9003: 'DateTimeOriginal',
- 0x829A: 'ExposureTime',
- 0x829D: 'FNumber',
- 0x8827: 'ISOSpeedRatings',
- 0x9201: 'ShutterSpeedValue',
- 0x9202: 'ApertureValue' ,
- 0x9207: 'MeteringMode',
- 0x9208: 'LightSource',
- 0x9209: 'Flash',
- 0x920A: 'FocalLength',
- 0xA402: 'ExposureMode',
- 0xA403: 'WhiteBalance',
- 0xA406: 'SceneCaptureType',
- 0xA404: 'DigitalZoomRatio',
- 0xA408: 'Contrast',
- 0xA409: 'Saturation',
- 0xA40A: 'Sharpness'
- },
- gps : {
- 0x0000: 'GPSVersionID',
- 0x0001: 'GPSLatitudeRef',
- 0x0002: 'GPSLatitude',
- 0x0003: 'GPSLongitudeRef',
- 0x0004: 'GPSLongitude'
- }
- };
-
- tagDescs = {
- 'ColorSpace': {
- 1: 'sRGB',
- 0: 'Uncalibrated'
- },
-
- 'MeteringMode': {
- 0: 'Unknown',
- 1: 'Average',
- 2: 'CenterWeightedAverage',
- 3: 'Spot',
- 4: 'MultiSpot',
- 5: 'Pattern',
- 6: 'Partial',
- 255: 'Other'
- },
-
- 'LightSource': {
- 1: 'Daylight',
- 2: 'Fliorescent',
- 3: 'Tungsten',
- 4: 'Flash',
- 9: 'Fine weather',
- 10: 'Cloudy weather',
- 11: 'Shade',
- 12: 'Daylight fluorescent (D 5700 - 7100K)',
- 13: 'Day white fluorescent (N 4600 -5400K)',
- 14: 'Cool white fluorescent (W 3900 - 4500K)',
- 15: 'White fluorescent (WW 3200 - 3700K)',
- 17: 'Standard light A',
- 18: 'Standard light B',
- 19: 'Standard light C',
- 20: 'D55',
- 21: 'D65',
- 22: 'D75',
- 23: 'D50',
- 24: 'ISO studio tungsten',
- 255: 'Other'
- },
-
- 'Flash': {
- 0x0000: 'Flash did not fire.',
- 0x0001: 'Flash fired.',
- 0x0005: 'Strobe return light not detected.',
- 0x0007: 'Strobe return light detected.',
- 0x0009: 'Flash fired, compulsory flash mode',
- 0x000D: 'Flash fired, compulsory flash mode, return light not detected',
- 0x000F: 'Flash fired, compulsory flash mode, return light detected',
- 0x0010: 'Flash did not fire, compulsory flash mode',
- 0x0018: 'Flash did not fire, auto mode',
- 0x0019: 'Flash fired, auto mode',
- 0x001D: 'Flash fired, auto mode, return light not detected',
- 0x001F: 'Flash fired, auto mode, return light detected',
- 0x0020: 'No flash function',
- 0x0041: 'Flash fired, red-eye reduction mode',
- 0x0045: 'Flash fired, red-eye reduction mode, return light not detected',
- 0x0047: 'Flash fired, red-eye reduction mode, return light detected',
- 0x0049: 'Flash fired, compulsory flash mode, red-eye reduction mode',
- 0x004D: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected',
- 0x004F: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected',
- 0x0059: 'Flash fired, auto mode, red-eye reduction mode',
- 0x005D: 'Flash fired, auto mode, return light not detected, red-eye reduction mode',
- 0x005F: 'Flash fired, auto mode, return light detected, red-eye reduction mode'
- },
-
- 'ExposureMode': {
- 0: 'Auto exposure',
- 1: 'Manual exposure',
- 2: 'Auto bracket'
- },
-
- 'WhiteBalance': {
- 0: 'Auto white balance',
- 1: 'Manual white balance'
- },
-
- 'SceneCaptureType': {
- 0: 'Standard',
- 1: 'Landscape',
- 2: 'Portrait',
- 3: 'Night scene'
- },
-
- 'Contrast': {
- 0: 'Normal',
- 1: 'Soft',
- 2: 'Hard'
- },
-
- 'Saturation': {
- 0: 'Normal',
- 1: 'Low saturation',
- 2: 'High saturation'
- },
-
- 'Sharpness': {
- 0: 'Normal',
- 1: 'Soft',
- 2: 'Hard'
- },
-
- // GPS related
- 'GPSLatitudeRef': {
- N: 'North latitude',
- S: 'South latitude'
- },
-
- 'GPSLongitudeRef': {
- E: 'East longitude',
- W: 'West longitude'
- }
- };
-
- function extractTags(IFD_offset, tags2extract) {
- var length = data.SHORT(IFD_offset), i, ii,
- tag, type, count, tagOffset, offset, value, values = [], hash = {};
-
- for (i = 0; i < length; i++) {
- // Set binary reader pointer to beginning of the next tag
- offset = tagOffset = IFD_offset + 12 * i + 2;
-
- tag = tags2extract[data.SHORT(offset)];
-
- if (tag === undefined) {
- continue; // Not the tag we requested
- }
-
- type = data.SHORT(offset+=2);
- count = data.LONG(offset+=2);
-
- offset += 4;
- values = [];
-
- switch (type) {
- case 1: // BYTE
- case 7: // UNDEFINED
- if (count > 4) {
- offset = data.LONG(offset) + offsets.tiffHeader;
- }
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.BYTE(offset + ii);
- }
-
- break;
-
- case 2: // STRING
- if (count > 4) {
- offset = data.LONG(offset) + offsets.tiffHeader;
- }
-
- hash[tag] = data.STRING(offset, count - 1);
-
- continue;
-
- case 3: // SHORT
- if (count > 2) {
- offset = data.LONG(offset) + offsets.tiffHeader;
- }
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.SHORT(offset + ii*2);
- }
-
- break;
-
- case 4: // LONG
- if (count > 1) {
- offset = data.LONG(offset) + offsets.tiffHeader;
- }
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.LONG(offset + ii*4);
- }
-
- break;
-
- case 5: // RATIONAL
- offset = data.LONG(offset) + offsets.tiffHeader;
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.LONG(offset + ii*4) / data.LONG(offset + ii*4 + 4);
- }
-
- break;
-
- case 9: // SLONG
- offset = data.LONG(offset) + offsets.tiffHeader;
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.SLONG(offset + ii*4);
- }
-
- break;
-
- case 10: // SRATIONAL
- offset = data.LONG(offset) + offsets.tiffHeader;
-
- for (ii = 0; ii < count; ii++) {
- values[ii] = data.SLONG(offset + ii*4) / data.SLONG(offset + ii*4 + 4);
- }
-
- break;
-
- default:
- continue;
- }
-
- value = (count == 1 ? values[0] : values);
-
- if (tagDescs.hasOwnProperty(tag) && typeof value != 'object') {
- hash[tag] = tagDescs[tag][value];
- } else {
- hash[tag] = value;
- }
- }
-
- return hash;
- }
-
- function getIFDOffsets() {
- var idx = offsets.tiffHeader;
-
- // Set read order of multi-byte data
- data.II(data.SHORT(idx) == 0x4949);
-
- // Check if always present bytes are indeed present
- if (data.SHORT(idx+=2) !== 0x002A) {
- return false;
- }
-
- offsets.IFD0 = offsets.tiffHeader + data.LONG(idx += 2);
- Tiff = extractTags(offsets.IFD0, tags.tiff);
-
- if ('ExifIFDPointer' in Tiff) {
- offsets.exifIFD = offsets.tiffHeader + Tiff.ExifIFDPointer;
- delete Tiff.ExifIFDPointer;
- }
-
- if ('GPSInfoIFDPointer' in Tiff) {
- offsets.gpsIFD = offsets.tiffHeader + Tiff.GPSInfoIFDPointer;
- delete Tiff.GPSInfoIFDPointer;
- }
- return true;
- }
-
- // At the moment only setting of simple (LONG) values, that do not require offset recalculation, is supported
- function setTag(ifd, tag, value) {
- var offset, length, tagOffset, valueOffset = 0;
-
- // If tag name passed translate into hex key
- if (typeof(tag) === 'string') {
- var tmpTags = tags[ifd.toLowerCase()];
- for (var hex in tmpTags) {
- if (tmpTags[hex] === tag) {
- tag = hex;
- break;
- }
- }
- }
- offset = offsets[ifd.toLowerCase() + 'IFD'];
- length = data.SHORT(offset);
-
- for (var i = 0; i < length; i++) {
- tagOffset = offset + 12 * i + 2;
-
- if (data.SHORT(tagOffset) == tag) {
- valueOffset = tagOffset + 8;
- break;
- }
- }
-
- if (!valueOffset) {
- return false;
- }
-
- data.LONG(valueOffset, value);
- return true;
- }
-
-
- // Public functions
- return {
- init: function(segment) {
- // Reset internal data
- offsets = {
- tiffHeader: 10
- };
-
- if (segment === undefined || !segment.length) {
- return false;
- }
-
- data.init(segment);
-
- // Check if that's APP1 and that it has EXIF
- if (data.SHORT(0) === 0xFFE1 && data.STRING(4, 5).toUpperCase() === "EXIF\0") {
- return getIFDOffsets();
- }
- return false;
- },
-
- TIFF: function() {
- return Tiff;
- },
-
- EXIF: function() {
- var Exif;
-
- // Populate EXIF hash
- Exif = extractTags(offsets.exifIFD, tags.exif);
-
- // Fix formatting of some tags
- if (Exif.ExifVersion && Basic.typeOf(Exif.ExifVersion) === 'array') {
- for (var i = 0, exifVersion = ''; i < Exif.ExifVersion.length; i++) {
- exifVersion += String.fromCharCode(Exif.ExifVersion[i]);
- }
- Exif.ExifVersion = exifVersion;
- }
-
- return Exif;
- },
-
- GPS: function() {
- var GPS;
-
- GPS = extractTags(offsets.gpsIFD, tags.gps);
-
- // iOS devices (and probably some others) do not put in GPSVersionID tag (why?..)
- if (GPS.GPSVersionID && Basic.typeOf(GPS.GPSVersionID) === 'array') {
- GPS.GPSVersionID = GPS.GPSVersionID.join('.');
- }
-
- return GPS;
- },
-
- setExif: function(tag, value) {
- // Right now only setting of width/height is possible
- if (tag !== 'PixelXDimension' && tag !== 'PixelYDimension') {return false;}
-
- return setTag('exif', tag, value);
- },
-
-
- getBinary: function() {
- return data.SEGMENT();
- },
-
- purge: function() {
- data.init(null);
- data = Tiff = null;
- offsets = {};
- }
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/JPEG.js
-
-/**
- * JPEG.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/JPEG
-@private
-*/
-define("moxie/runtime/html5/image/JPEG", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/html5/image/JPEGHeaders",
- "moxie/runtime/html5/utils/BinaryReader",
- "moxie/runtime/html5/image/ExifParser"
-], function(Basic, x, JPEGHeaders, BinaryReader, ExifParser) {
-
- function JPEG(binstr) {
- var _binstr, _br, _hm, _ep, _info, hasExif;
-
- function _getDimensions() {
- var idx = 0, marker, length;
-
- // examine all through the end, since some images might have very large APP segments
- while (idx <= _binstr.length) {
- marker = _br.SHORT(idx += 2);
-
- if (marker >= 0xFFC0 && marker <= 0xFFC3) { // SOFn
- idx += 5; // marker (2 bytes) + length (2 bytes) + Sample precision (1 byte)
- return {
- height: _br.SHORT(idx),
- width: _br.SHORT(idx += 2)
- };
- }
- length = _br.SHORT(idx += 2);
- idx += length - 2;
- }
- return null;
- }
-
- _binstr = binstr;
-
- _br = new BinaryReader();
- _br.init(_binstr);
-
- // check if it is jpeg
- if (_br.SHORT(0) !== 0xFFD8) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
-
- // backup headers
- _hm = new JPEGHeaders(binstr);
-
- // extract exif info
- _ep = new ExifParser();
- hasExif = !!_ep.init(_hm.get('app1')[0]);
-
- // get dimensions
- _info = _getDimensions.call(this);
-
- Basic.extend(this, {
- type: 'image/jpeg',
-
- size: _binstr.length,
-
- width: _info && _info.width || 0,
-
- height: _info && _info.height || 0,
-
- setExif: function(tag, value) {
- if (!hasExif) {
- return false; // or throw an exception
- }
-
- if (Basic.typeOf(tag) === 'object') {
- Basic.each(tag, function(value, tag) {
- _ep.setExif(tag, value);
- });
- } else {
- _ep.setExif(tag, value);
- }
-
- // update internal headers
- _hm.set('app1', _ep.getBinary());
- },
-
- writeHeaders: function() {
- if (!arguments.length) {
- // if no arguments passed, update headers internally
- return (_binstr = _hm.restore(_binstr));
- }
- return _hm.restore(arguments[0]);
- },
-
- stripHeaders: function(binstr) {
- return _hm.strip(binstr);
- },
-
- purge: function() {
- _purge.call(this);
- }
- });
-
- if (hasExif) {
- this.meta = {
- tiff: _ep.TIFF(),
- exif: _ep.EXIF(),
- gps: _ep.GPS()
- };
- }
-
- function _purge() {
- if (!_ep || !_hm || !_br) {
- return; // ignore any repeating purge requests
- }
- _ep.purge();
- _hm.purge();
- _br.init(null);
- _binstr = _info = _hm = _ep = _br = null;
- }
- }
-
- return JPEG;
-});
-
-// Included from: src/javascript/runtime/html5/image/PNG.js
-
-/**
- * PNG.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/PNG
-@private
-*/
-define("moxie/runtime/html5/image/PNG", [
- "moxie/core/Exceptions",
- "moxie/core/utils/Basic",
- "moxie/runtime/html5/utils/BinaryReader"
-], function(x, Basic, BinaryReader) {
-
- function PNG(binstr) {
- var _binstr, _br, _hm, _ep, _info;
-
- _binstr = binstr;
-
- _br = new BinaryReader();
- _br.init(_binstr);
-
- // check if it's png
- (function() {
- var idx = 0, i = 0
- , signature = [0x8950, 0x4E47, 0x0D0A, 0x1A0A]
- ;
-
- for (i = 0; i < signature.length; i++, idx += 2) {
- if (signature[i] != _br.SHORT(idx)) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
- }
- }());
-
- function _getDimensions() {
- var chunk, idx;
-
- chunk = _getChunkAt.call(this, 8);
-
- if (chunk.type == 'IHDR') {
- idx = chunk.start;
- return {
- width: _br.LONG(idx),
- height: _br.LONG(idx += 4)
- };
- }
- return null;
- }
-
- function _purge() {
- if (!_br) {
- return; // ignore any repeating purge requests
- }
- _br.init(null);
- _binstr = _info = _hm = _ep = _br = null;
- }
-
- _info = _getDimensions.call(this);
-
- Basic.extend(this, {
- type: 'image/png',
-
- size: _binstr.length,
-
- width: _info.width,
-
- height: _info.height,
-
- purge: function() {
- _purge.call(this);
- }
- });
-
- // for PNG we can safely trigger purge automatically, as we do not keep any data for later
- _purge.call(this);
-
- function _getChunkAt(idx) {
- var length, type, start, CRC;
-
- length = _br.LONG(idx);
- type = _br.STRING(idx += 4, 4);
- start = idx += 4;
- CRC = _br.LONG(idx + length);
-
- return {
- length: length,
- type: type,
- start: start,
- CRC: CRC
- };
- }
- }
-
- return PNG;
-});
-
-// Included from: src/javascript/runtime/html5/image/ImageInfo.js
-
-/**
- * ImageInfo.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/ImageInfo
-@private
-*/
-define("moxie/runtime/html5/image/ImageInfo", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/html5/image/JPEG",
- "moxie/runtime/html5/image/PNG"
-], function(Basic, x, JPEG, PNG) {
- /**
- Optional image investigation tool for HTML5 runtime. Provides the following features:
- - ability to distinguish image type (JPEG or PNG) by signature
- - ability to extract image width/height directly from it's internals, without preloading in memory (fast)
- - ability to extract APP headers from JPEGs (Exif, GPS, etc)
- - ability to replace width/height tags in extracted JPEG headers
- - ability to restore APP headers, that were for example stripped during image manipulation
-
- @class ImageInfo
- @constructor
- @param {String} binstr Image source as binary string
- */
- return function(binstr) {
- var _cs = [JPEG, PNG], _img;
-
- // figure out the format, throw: ImageError.WRONG_FORMAT if not supported
- _img = (function() {
- for (var i = 0; i < _cs.length; i++) {
- try {
- return new _cs[i](binstr);
- } catch (ex) {
- // console.info(ex);
- }
- }
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }());
-
- Basic.extend(this, {
- /**
- Image Mime Type extracted from it's depths
-
- @property type
- @type {String}
- @default ''
- */
- type: '',
-
- /**
- Image size in bytes
-
- @property size
- @type {Number}
- @default 0
- */
- size: 0,
-
- /**
- Image width extracted from image source
-
- @property width
- @type {Number}
- @default 0
- */
- width: 0,
-
- /**
- Image height extracted from image source
-
- @property height
- @type {Number}
- @default 0
- */
- height: 0,
-
- /**
- Sets Exif tag. Currently applicable only for width and height tags. Obviously works only with JPEGs.
-
- @method setExif
- @param {String} tag Tag to set
- @param {Mixed} value Value to assign to the tag
- */
- setExif: function() {},
-
- /**
- Restores headers to the source.
-
- @method writeHeaders
- @param {String} data Image source as binary string
- @return {String} Updated binary string
- */
- writeHeaders: function(data) {
- return data;
- },
-
- /**
- Strip all headers from the source.
-
- @method stripHeaders
- @param {String} data Image source as binary string
- @return {String} Updated binary string
- */
- stripHeaders: function(data) {
- return data;
- },
-
- /**
- Dispose resources.
-
- @method purge
- */
- purge: function() {}
- });
-
- Basic.extend(this, _img);
-
- this.purge = function() {
- _img.purge();
- _img = null;
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/MegaPixel.js
-
-/**
-(The MIT License)
-
-Copyright (c) 2012 Shinichi Tomita ;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-/**
- * Mega pixel image rendering library for iOS6 Safari
- *
- * Fixes iOS6 Safari's image file rendering issue for large size image (over mega-pixel),
- * which causes unexpected subsampling when drawing it in canvas.
- * By using this library, you can safely render the image with proper stretching.
- *
- * Copyright (c) 2012 Shinichi Tomita
- * Released under the MIT license
- */
-
-/**
-@class moxie/runtime/html5/image/MegaPixel
-@private
-*/
-define("moxie/runtime/html5/image/MegaPixel", [], function() {
-
- /**
- * Rendering image element (with resizing) into the canvas element
- */
- function renderImageToCanvas(img, canvas, options) {
- var iw = img.naturalWidth, ih = img.naturalHeight;
- var width = options.width, height = options.height;
- var x = options.x || 0, y = options.y || 0;
- var ctx = canvas.getContext('2d');
- if (detectSubsampling(img)) {
- iw /= 2;
- ih /= 2;
- }
- var d = 1024; // size of tiling canvas
- var tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
- var tmpCtx = tmpCanvas.getContext('2d');
- var vertSquashRatio = detectVerticalSquash(img, iw, ih);
- var sy = 0;
- while (sy < ih) {
- var sh = sy + d > ih ? ih - sy : d;
- var sx = 0;
- while (sx < iw) {
- var sw = sx + d > iw ? iw - sx : d;
- tmpCtx.clearRect(0, 0, d, d);
- tmpCtx.drawImage(img, -sx, -sy);
- var dx = (sx * width / iw + x) << 0;
- var dw = Math.ceil(sw * width / iw);
- var dy = (sy * height / ih / vertSquashRatio + y) << 0;
- var dh = Math.ceil(sh * height / ih / vertSquashRatio);
- ctx.drawImage(tmpCanvas, 0, 0, sw, sh, dx, dy, dw, dh);
- sx += d;
- }
- sy += d;
- }
- tmpCanvas = tmpCtx = null;
- }
-
- /**
- * Detect subsampling in loaded image.
- * In iOS, larger images than 2M pixels may be subsampled in rendering.
- */
- function detectSubsampling(img) {
- var iw = img.naturalWidth, ih = img.naturalHeight;
- if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image
- var canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, -iw + 1, 0);
- // subsampled image becomes half smaller in rendering size.
- // check alpha channel value to confirm image is covering edge pixel or not.
- // if alpha value is 0 image is not covering, hence subsampled.
- return ctx.getImageData(0, 0, 1, 1).data[3] === 0;
- } else {
- return false;
- }
- }
-
-
- /**
- * Detecting vertical squash in loaded image.
- * Fixes a bug which squash image vertically while drawing into canvas for some images.
- */
- function detectVerticalSquash(img, iw, ih) {
- var canvas = document.createElement('canvas');
- canvas.width = 1;
- canvas.height = ih;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, 1, ih).data;
- // search image edge pixel position in case it is squashed vertically.
- var sy = 0;
- var ey = ih;
- var py = ih;
- while (py > sy) {
- var alpha = data[(py - 1) * 4 + 3];
- if (alpha === 0) {
- ey = py;
- } else {
- sy = py;
- }
- py = (ey + sy) >> 1;
- }
- canvas = null;
- var ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
- return {
- isSubsampled: detectSubsampling,
- renderTo: renderImageToCanvas
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/Image
-@private
-*/
-define("moxie/runtime/html5/image/Image", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/core/utils/Encode",
- "moxie/file/File",
- "moxie/runtime/html5/image/ImageInfo",
- "moxie/runtime/html5/image/MegaPixel",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, Basic, x, Encode, File, ImageInfo, MegaPixel, Mime, Env) {
-
- function HTML5Image() {
- var me = this
- , _img, _imgInfo, _canvas, _binStr, _blob
- , _modified = false // is set true whenever image is modified
- , _preserveHeaders = true
- ;
-
- Basic.extend(this, {
- loadFromBlob: function(blob) {
- var comp = this, I = comp.getRuntime()
- , asBinary = arguments.length > 1 ? arguments[1] : true
- ;
-
- if (!I.can('access_binary')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- _blob = blob;
-
- if (blob.isDetached()) {
- _binStr = blob.getSource();
- _preload.call(this, _binStr);
- return;
- } else {
- _readAsDataUrl.call(this, blob.getSource(), function(dataUrl) {
- if (asBinary) {
- _binStr = _toBinary(dataUrl);
- }
- _preload.call(comp, dataUrl);
- });
- }
- },
-
- loadFromImage: function(img, exact) {
- this.meta = img.meta;
-
- _blob = new File(null, {
- name: img.name,
- size: img.size,
- type: img.type
- });
-
- _preload.call(this, exact ? (_binStr = img.getAsBinaryString()) : img.getAsDataURL());
- },
-
- getInfo: function() {
- var I = this.getRuntime(), info;
-
- if (!_imgInfo && _binStr && I.can('access_image_binary')) {
- _imgInfo = new ImageInfo(_binStr);
- }
-
- info = {
- width: _getImg().width || 0,
- height: _getImg().height || 0,
- type: _blob.type || Mime.getFileMime(_blob.name),
- size: _binStr && _binStr.length || _blob.size || 0,
- name: _blob.name || '',
- meta: _imgInfo && _imgInfo.meta || this.meta || {}
- };
-
- return info;
- },
-
- downsize: function() {
- _downsize.apply(this, arguments);
- },
-
- getAsCanvas: function() {
- if (_canvas) {
- _canvas.id = this.uid + '_canvas';
- }
- return _canvas;
- },
-
- getAsBlob: function(type, quality) {
- if (type !== this.type) {
- // if different mime type requested prepare image for conversion
- _downsize.call(this, this.width, this.height, false);
- }
- return new File(null, {
- name: _blob.name || '',
- type: type,
- data: me.getAsBinaryString.call(this, type, quality)
- });
- },
-
- getAsDataURL: function(type) {
- var quality = arguments[1] || 90;
-
- // if image has not been modified, return the source right away
- if (!_modified) {
- return _img.src;
- }
-
- if ('image/jpeg' !== type) {
- return _canvas.toDataURL('image/png');
- } else {
- try {
- // older Geckos used to result in an exception on quality argument
- return _canvas.toDataURL('image/jpeg', quality/100);
- } catch (ex) {
- return _canvas.toDataURL('image/jpeg');
- }
- }
- },
-
- getAsBinaryString: function(type, quality) {
- // if image has not been modified, return the source right away
- if (!_modified) {
- // if image was not loaded from binary string
- if (!_binStr) {
- _binStr = _toBinary(me.getAsDataURL(type, quality));
- }
- return _binStr;
- }
-
- if ('image/jpeg' !== type) {
- _binStr = _toBinary(me.getAsDataURL(type, quality));
- } else {
- var dataUrl;
-
- // if jpeg
- if (!quality) {
- quality = 90;
- }
-
- try {
- // older Geckos used to result in an exception on quality argument
- dataUrl = _canvas.toDataURL('image/jpeg', quality/100);
- } catch (ex) {
- dataUrl = _canvas.toDataURL('image/jpeg');
- }
-
- _binStr = _toBinary(dataUrl);
-
- if (_imgInfo) {
- _binStr = _imgInfo.stripHeaders(_binStr);
-
- if (_preserveHeaders) {
- // update dimensions info in exif
- if (_imgInfo.meta && _imgInfo.meta.exif) {
- _imgInfo.setExif({
- PixelXDimension: this.width,
- PixelYDimension: this.height
- });
- }
-
- // re-inject the headers
- _binStr = _imgInfo.writeHeaders(_binStr);
- }
-
- // will be re-created from fresh on next getInfo call
- _imgInfo.purge();
- _imgInfo = null;
- }
- }
-
- _modified = false;
-
- return _binStr;
- },
-
- destroy: function() {
- me = null;
- _purge.call(this);
- this.getRuntime().getShim().removeInstance(this.uid);
- }
- });
-
-
- function _getImg() {
- if (!_canvas && !_img) {
- throw new x.ImageError(x.DOMException.INVALID_STATE_ERR);
- }
- return _canvas || _img;
- }
-
-
- function _toBinary(str) {
- return Encode.atob(str.substring(str.indexOf('base64,') + 7));
- }
-
-
- function _toDataUrl(str, type) {
- return 'data:' + (type || '') + ';base64,' + Encode.btoa(str);
- }
-
-
- function _preload(str) {
- var comp = this;
-
- _img = new Image();
- _img.onerror = function() {
- _purge.call(this);
- comp.trigger('error', new x.ImageError(x.ImageError.WRONG_FORMAT));
- };
- _img.onload = function() {
- comp.trigger('load');
- };
-
- _img.src = /^data:[^;]*;base64,/.test(str) ? str : _toDataUrl(str, _blob.type);
- }
-
-
- function _readAsDataUrl(file, callback) {
- var comp = this, fr;
-
- // use FileReader if it's available
- if (window.FileReader) {
- fr = new FileReader();
- fr.onload = function() {
- callback(this.result);
- };
- fr.onerror = function() {
- comp.trigger('error', new x.FileException(x.FileException.NOT_READABLE_ERR));
- };
- fr.readAsDataURL(file);
- } else {
- return callback(file.getAsDataURL());
- }
- }
-
- function _downsize(width, height, crop, preserveHeaders) {
- var self = this
- , scale
- , mathFn
- , x = 0
- , y = 0
- , img
- , destWidth
- , destHeight
- , orientation
- ;
-
- _preserveHeaders = preserveHeaders; // we will need to check this on export (see getAsBinaryString())
-
- // take into account orientation tag
- orientation = (this.meta && this.meta.tiff && this.meta.tiff.Orientation) || 1;
-
- if (Basic.inArray(orientation, [5,6,7,8]) !== -1) { // values that require 90 degree rotation
- // swap dimensions
- var tmp = width;
- width = height;
- height = tmp;
- }
-
- img = _getImg();
-
- // unify dimensions
- mathFn = !crop ? Math.min : Math.max;
- scale = mathFn(width/img.width, height/img.height);
-
- // we only downsize here
- if (scale > 1 && (!crop || preserveHeaders)) { // when cropping one of dimensions may still exceed max, so process it anyway
- this.trigger('Resize');
- return;
- }
-
- // prepare canvas if necessary
- if (!_canvas) {
- _canvas = document.createElement("canvas");
- }
-
- // calculate dimensions of proportionally resized image
- destWidth = Math.round(img.width * scale);
- destHeight = Math.round(img.height * scale);
-
-
- // scale image and canvas
- if (crop) {
- _canvas.width = width;
- _canvas.height = height;
-
- // if dimensions of the resulting image still larger than canvas, center it
- if (destWidth > width) {
- x = Math.round((destWidth - width) / 2);
- }
-
- if (destHeight > height) {
- y = Math.round((destHeight - height) / 2);
- }
- } else {
- _canvas.width = destWidth;
- _canvas.height = destHeight;
- }
-
- // rotate if required, according to orientation tag
- if (!_preserveHeaders) {
- _rotateToOrientaion(_canvas.width, _canvas.height, orientation);
- }
-
- _drawToCanvas.call(this, img, _canvas, -x, -y, destWidth, destHeight);
-
- this.width = _canvas.width;
- this.height = _canvas.height;
-
- _modified = true;
- self.trigger('Resize');
- }
-
-
- function _drawToCanvas(img, canvas, x, y, w, h) {
- if (Env.OS === 'iOS') {
- // avoid squish bug in iOS6
- MegaPixel.renderTo(img, canvas, { width: w, height: h, x: x, y: y });
- } else {
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, x, y, w, h);
- }
- }
-
-
- /**
- * Transform canvas coordination according to specified frame size and orientation
- * Orientation value is from EXIF tag
- * @author Shinichi Tomita
- */
- function _rotateToOrientaion(width, height, orientation) {
- switch (orientation) {
- case 5:
- case 6:
- case 7:
- case 8:
- _canvas.width = height;
- _canvas.height = width;
- break;
- default:
- _canvas.width = width;
- _canvas.height = height;
- }
-
- /**
- 1 = The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.
- 2 = The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.
- 3 = The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.
- 4 = The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.
- 5 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.
- 6 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
- 7 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.
- 8 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.
- */
-
- var ctx = _canvas.getContext('2d');
- switch (orientation) {
- case 2:
- // horizontal flip
- ctx.translate(width, 0);
- ctx.scale(-1, 1);
- break;
- case 3:
- // 180 rotate left
- ctx.translate(width, height);
- ctx.rotate(Math.PI);
- break;
- case 4:
- // vertical flip
- ctx.translate(0, height);
- ctx.scale(1, -1);
- break;
- case 5:
- // vertical flip + 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.scale(1, -1);
- break;
- case 6:
- // 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.translate(0, -height);
- break;
- case 7:
- // horizontal flip + 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.translate(width, -height);
- ctx.scale(-1, 1);
- break;
- case 8:
- // 90 rotate left
- ctx.rotate(-0.5 * Math.PI);
- ctx.translate(-width, 0);
- break;
- }
- }
-
-
- function _purge() {
- if (_imgInfo) {
- _imgInfo.purge();
- _imgInfo = null;
- }
- _binStr = _img = _canvas = _blob = null;
- _modified = false;
- }
- }
-
- return (extensions.Image = HTML5Image);
-});
-
-// Included from: src/javascript/runtime/flash/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global ActiveXObject:true */
-
-/**
-Defines constructor for Flash runtime.
-
-@class moxie/runtime/flash/Runtime
-@private
-*/
-define("moxie/runtime/flash/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Env",
- "moxie/core/utils/Dom",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime"
-], function(Basic, Env, Dom, x, Runtime) {
-
- var type = 'flash', extensions = {};
-
- /**
- Get the version of the Flash Player
-
- @method getShimVersion
- @private
- @return {Number} Flash Player version
- */
- function getShimVersion() {
- var version;
-
- try {
- version = navigator.plugins['Shockwave Flash'];
- version = version.description;
- } catch (e1) {
- try {
- version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
- } catch (e2) {
- version = '0.0';
- }
- }
- version = version.match(/\d+/g);
- return parseFloat(version[0] + '.' + version[1]);
- }
-
- /**
- Constructor for the Flash Runtime
-
- @class FlashRuntime
- @extends Runtime
- */
- function FlashRuntime(options) {
- var I = this, initTimer;
-
- options = Basic.extend({ swf_url: Env.swf_url }, options);
-
- Runtime.call(this, options, type, {
- access_binary: function(value) {
- return value && I.mode === 'browser';
- },
- access_image_binary: function(value) {
- return value && I.mode === 'browser';
- },
- display_media: Runtime.capTrue,
- do_cors: Runtime.capTrue,
- drag_and_drop: false,
- report_upload_progress: function() {
- return I.mode === 'client';
- },
- resize_image: Runtime.capTrue,
- return_response_headers: false,
- return_response_type: function(responseType) {
- if (responseType === 'json' && !!window.JSON) {
- return true;
- }
- return !Basic.arrayDiff(responseType, ['', 'text', 'document']) || I.mode === 'browser';
- },
- return_status_code: function(code) {
- return I.mode === 'browser' || !Basic.arrayDiff(code, [200, 404]);
- },
- select_file: Runtime.capTrue,
- select_multiple: Runtime.capTrue,
- send_binary_string: function(value) {
- return value && I.mode === 'browser';
- },
- send_browser_cookies: function(value) {
- return value && I.mode === 'browser';
- },
- send_custom_headers: function(value) {
- return value && I.mode === 'browser';
- },
- send_multipart: Runtime.capTrue,
- slice_blob: Runtime.capTrue,
- stream_upload: function(value) {
- return value && I.mode === 'browser';
- },
- summon_file_dialog: false,
- upload_filesize: function(size) {
- return Basic.parseSizeStr(size) <= 2097152 || I.mode === 'client';
- },
- use_http_method: function(methods) {
- return !Basic.arrayDiff(methods, ['GET', 'POST']);
- }
- }, {
- // capabilities that require specific mode
- access_binary: function(value) {
- return value ? 'browser' : 'client';
- },
- access_image_binary: function(value) {
- return value ? 'browser' : 'client';
- },
- report_upload_progress: function(value) {
- return value ? 'browser' : 'client';
- },
- return_response_type: function(responseType) {
- return Basic.arrayDiff(responseType, ['', 'text', 'json', 'document']) ? 'browser' : ['client', 'browser'];
- },
- return_status_code: function(code) {
- return Basic.arrayDiff(code, [200, 404]) ? 'browser' : ['client', 'browser'];
- },
- send_binary_string: function(value) {
- return value ? 'browser' : 'client';
- },
- send_browser_cookies: function(value) {
- return value ? 'browser' : 'client';
- },
- send_custom_headers: function(value) {
- return value ? 'browser' : 'client';
- },
- stream_upload: function(value) {
- return value ? 'client' : 'browser';
- },
- upload_filesize: function(size) {
- return Basic.parseSizeStr(size) >= 2097152 ? 'client' : 'browser';
- }
- }, 'client');
-
-
- // minimal requirement for Flash Player version
- if (getShimVersion() < 10) {
- this.mode = false; // with falsy mode, runtime won't operable, no matter what the mode was before
- }
-
-
- Basic.extend(this, {
-
- getShim: function() {
- return Dom.get(this.uid);
- },
-
- shimExec: function(component, action) {
- var args = [].slice.call(arguments, 2);
- return I.getShim().exec(this.uid, component, action, args);
- },
-
- init: function() {
- var html, el, container;
-
- container = this.getShimContainer();
-
- // if not the minimal height, shims are not initialized in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
- Basic.extend(container.style, {
- position: 'absolute',
- top: '-8px',
- left: '-8px',
- width: '9px',
- height: '9px',
- overflow: 'hidden'
- });
-
- // insert flash object
- html = '' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ';
-
- if (Env.browser === 'IE') {
- el = document.createElement('div');
- container.appendChild(el);
- el.outerHTML = html;
- el = container = null; // just in case
- } else {
- container.innerHTML = html;
- }
-
- // Init is dispatched by the shim
- initTimer = setTimeout(function() {
- if (I && !I.initialized) { // runtime might be already destroyed by this moment
- I.trigger("Error", new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR));
- }
- }, 5000);
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- clearTimeout(initTimer); // initialization check might be still onwait
- options = initTimer = destroy = I = null;
- };
- }(this.destroy))
-
- }, extensions);
- }
-
- Runtime.addConstructor(type, FlashRuntime);
-
- return extensions;
-});
-
-// Included from: src/javascript/runtime/flash/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/file/Blob
-@private
-*/
-define("moxie/runtime/flash/file/Blob", [
- "moxie/runtime/flash/Runtime",
- "moxie/file/Blob"
-], function(extensions, Blob) {
-
- var FlashBlob = {
- slice: function(blob, start, end, type) {
- var self = this.getRuntime();
-
- if (start < 0) {
- start = Math.max(blob.size + start, 0);
- } else if (start > 0) {
- start = Math.min(start, blob.size);
- }
-
- if (end < 0) {
- end = Math.max(blob.size + end, 0);
- } else if (end > 0) {
- end = Math.min(end, blob.size);
- }
-
- blob = self.shimExec.call(this, 'Blob', 'slice', start, end, type || '');
-
- if (blob) {
- blob = new Blob(self.uid, blob);
- }
- return blob;
- }
- };
-
- return (extensions.Blob = FlashBlob);
-});
-
-// Included from: src/javascript/runtime/flash/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/file/FileInput
-@private
-*/
-define("moxie/runtime/flash/file/FileInput", [
- "moxie/runtime/flash/Runtime"
-], function(extensions) {
-
- var FileInput = {
- init: function(options) {
- this.getRuntime().shimExec.call(this, 'FileInput', 'init', {
- name: options.name,
- accept: options.accept,
- multiple: options.multiple
- });
- this.trigger('ready');
- }
- };
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/flash/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/file/FileReader
-@private
-*/
-define("moxie/runtime/flash/file/FileReader", [
- "moxie/runtime/flash/Runtime",
- "moxie/core/utils/Encode"
-], function(extensions, Encode) {
-
- var _result = '';
-
- function _formatData(data, op) {
- switch (op) {
- case 'readAsText':
- return Encode.atob(data, 'utf8');
- case 'readAsBinaryString':
- return Encode.atob(data);
- case 'readAsDataURL':
- return data;
- }
- return null;
- }
-
- var FileReader = {
- read: function(op, blob) {
- var target = this, self = target.getRuntime();
-
- // special prefix for DataURL read mode
- if (op === 'readAsDataURL') {
- _result = 'data:' + (blob.type || '') + ';base64,';
- }
-
- target.bind('Progress', function(e, data) {
- if (data) {
- _result += _formatData(data, op);
- }
- });
-
- return self.shimExec.call(this, 'FileReader', 'readAsBase64', blob.uid);
- },
-
- getResult: function() {
- return _result;
- },
-
- destroy: function() {
- _result = null;
- }
- };
-
- return (extensions.FileReader = FileReader);
-});
-
-// Included from: src/javascript/runtime/flash/file/FileReaderSync.js
-
-/**
- * FileReaderSync.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/file/FileReaderSync
-@private
-*/
-define("moxie/runtime/flash/file/FileReaderSync", [
- "moxie/runtime/flash/Runtime",
- "moxie/core/utils/Encode"
-], function(extensions, Encode) {
-
- function _formatData(data, op) {
- switch (op) {
- case 'readAsText':
- return Encode.atob(data, 'utf8');
- case 'readAsBinaryString':
- return Encode.atob(data);
- case 'readAsDataURL':
- return data;
- }
- return null;
- }
-
- var FileReaderSync = {
- read: function(op, blob) {
- var result, self = this.getRuntime();
-
- result = self.shimExec.call(this, 'FileReaderSync', 'readAsBase64', blob.uid);
- if (!result) {
- return null; // or throw ex
- }
-
- // special prefix for DataURL read mode
- if (op === 'readAsDataURL') {
- result = 'data:' + (blob.type || '') + ';base64,' + result;
- }
-
- return _formatData(result, op, blob.type);
- }
- };
-
- return (extensions.FileReaderSync = FileReaderSync);
-});
-
-// Included from: src/javascript/runtime/flash/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/flash/xhr/XMLHttpRequest", [
- "moxie/runtime/flash/Runtime",
- "moxie/core/utils/Basic",
- "moxie/file/Blob",
- "moxie/file/File",
- "moxie/file/FileReaderSync",
- "moxie/xhr/FormData",
- "moxie/runtime/Transporter"
-], function(extensions, Basic, Blob, File, FileReaderSync, FormData, Transporter) {
-
- var XMLHttpRequest = {
-
- send: function(meta, data) {
- var target = this, self = target.getRuntime();
-
- function send() {
- meta.transport = self.mode;
- self.shimExec.call(target, 'XMLHttpRequest', 'send', meta, data);
- }
-
-
- function appendBlob(name, blob) {
- self.shimExec.call(target, 'XMLHttpRequest', 'appendBlob', name, blob.uid);
- data = null;
- send();
- }
-
-
- function attachBlob(blob, cb) {
- var tr = new Transporter();
-
- tr.bind("TransportingComplete", function() {
- cb(this.result);
- });
-
- tr.transport(blob.getSource(), blob.type, {
- ruid: self.uid
- });
- }
-
- // copy over the headers if any
- if (!Basic.isEmptyObj(meta.headers)) {
- Basic.each(meta.headers, function(value, header) {
- self.shimExec.call(target, 'XMLHttpRequest', 'setRequestHeader', header, value.toString()); // Silverlight doesn't accept integers into the arguments of type object
- });
- }
-
- // transfer over multipart params and blob itself
- if (data instanceof FormData) {
- var blobField;
- data.each(function(value, name) {
- if (value instanceof Blob) {
- blobField = name;
- } else {
- self.shimExec.call(target, 'XMLHttpRequest', 'append', name, value);
- }
- });
-
- if (!data.hasBlob()) {
- data = null;
- send();
- } else {
- var blob = data.getBlob();
- if (blob.isDetached()) {
- attachBlob(blob, function(attachedBlob) {
- blob.destroy();
- appendBlob(blobField, attachedBlob);
- });
- } else {
- appendBlob(blobField, blob);
- }
- }
- } else if (data instanceof Blob) {
- if (data.isDetached()) {
- attachBlob(data, function(attachedBlob) {
- data.destroy();
- data = attachedBlob.uid;
- send();
- });
- } else {
- data = data.uid;
- send();
- }
- } else {
- send();
- }
- },
-
- getResponse: function(responseType) {
- var frs, blob, self = this.getRuntime();
-
- blob = self.shimExec.call(this, 'XMLHttpRequest', 'getResponseAsBlob');
-
- if (blob) {
- blob = new File(self.uid, blob);
-
- if ('blob' === responseType) {
- return blob;
- }
-
- try {
- frs = new FileReaderSync();
-
- if (!!~Basic.inArray(responseType, ["", "text"])) {
- return frs.readAsText(blob);
- } else if ('json' === responseType && !!window.JSON) {
- return JSON.parse(frs.readAsText(blob));
- }
- } finally {
- blob.destroy();
- }
- }
- return null;
- },
-
- abort: function(upload_complete_flag) {
- var self = this.getRuntime();
-
- self.shimExec.call(this, 'XMLHttpRequest', 'abort');
-
- this.dispatchEvent('readystatechange');
- // this.dispatchEvent('progress');
- this.dispatchEvent('abort');
-
- //if (!upload_complete_flag) {
- // this.dispatchEvent('uploadprogress');
- //}
- }
- };
-
- return (extensions.XMLHttpRequest = XMLHttpRequest);
-});
-
-// Included from: src/javascript/runtime/flash/runtime/Transporter.js
-
-/**
- * Transporter.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/runtime/Transporter
-@private
-*/
-define("moxie/runtime/flash/runtime/Transporter", [
- "moxie/runtime/flash/Runtime",
- "moxie/file/Blob"
-], function(extensions, Blob) {
-
- var Transporter = {
- getAsBlob: function(type) {
- var self = this.getRuntime()
- , blob = self.shimExec.call(this, 'Transporter', 'getAsBlob', type)
- ;
- if (blob) {
- return new Blob(self.uid, blob);
- }
- return null;
- }
- };
-
- return (extensions.Transporter = Transporter);
-});
-
-// Included from: src/javascript/runtime/flash/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/flash/image/Image
-@private
-*/
-define("moxie/runtime/flash/image/Image", [
- "moxie/runtime/flash/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/Transporter",
- "moxie/file/Blob",
- "moxie/file/FileReaderSync"
-], function(extensions, Basic, Transporter, Blob, FileReaderSync) {
-
- var Image = {
- loadFromBlob: function(blob) {
- var comp = this, self = comp.getRuntime();
-
- function exec(srcBlob) {
- self.shimExec.call(comp, 'Image', 'loadFromBlob', srcBlob.uid);
- comp = self = null;
- }
-
- if (blob.isDetached()) { // binary string
- var tr = new Transporter();
- tr.bind("TransportingComplete", function() {
- exec(tr.result.getSource());
- });
- tr.transport(blob.getSource(), blob.type, { ruid: self.uid });
- } else {
- exec(blob.getSource());
- }
- },
-
- loadFromImage: function(img) {
- var self = this.getRuntime();
- return self.shimExec.call(this, 'Image', 'loadFromImage', img.uid);
- },
-
- getAsBlob: function(type, quality) {
- var self = this.getRuntime()
- , blob = self.shimExec.call(this, 'Image', 'getAsBlob', type, quality)
- ;
- if (blob) {
- return new Blob(self.uid, blob);
- }
- return null;
- },
-
- getAsDataURL: function() {
- var self = this.getRuntime()
- , blob = self.Image.getAsBlob.apply(this, arguments)
- , frs
- ;
- if (!blob) {
- return null;
- }
- frs = new FileReaderSync();
- return frs.readAsDataURL(blob);
- }
- };
-
- return (extensions.Image = Image);
-});
-
-// Included from: src/javascript/runtime/silverlight/Runtime.js
-
-/**
- * RunTime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global ActiveXObject:true */
-
-/**
-Defines constructor for Silverlight runtime.
-
-@class moxie/runtime/silverlight/Runtime
-@private
-*/
-define("moxie/runtime/silverlight/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Env",
- "moxie/core/utils/Dom",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime"
-], function(Basic, Env, Dom, x, Runtime) {
-
- var type = "silverlight", extensions = {};
-
- function isInstalled(version) {
- var isVersionSupported = false, control = null, actualVer,
- actualVerArray, reqVerArray, requiredVersionPart, actualVersionPart, index = 0;
-
- try {
- try {
- control = new ActiveXObject('AgControl.AgControl');
-
- if (control.IsVersionSupported(version)) {
- isVersionSupported = true;
- }
-
- control = null;
- } catch (e) {
- var plugin = navigator.plugins["Silverlight Plug-In"];
-
- if (plugin) {
- actualVer = plugin.description;
-
- if (actualVer === "1.0.30226.2") {
- actualVer = "2.0.30226.2";
- }
-
- actualVerArray = actualVer.split(".");
-
- while (actualVerArray.length > 3) {
- actualVerArray.pop();
- }
-
- while ( actualVerArray.length < 4) {
- actualVerArray.push(0);
- }
-
- reqVerArray = version.split(".");
-
- while (reqVerArray.length > 4) {
- reqVerArray.pop();
- }
-
- do {
- requiredVersionPart = parseInt(reqVerArray[index], 10);
- actualVersionPart = parseInt(actualVerArray[index], 10);
- index++;
- } while (index < reqVerArray.length && requiredVersionPart === actualVersionPart);
-
- if (requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart)) {
- isVersionSupported = true;
- }
- }
- }
- } catch (e2) {
- isVersionSupported = false;
- }
-
- return isVersionSupported;
- }
-
- /**
- Constructor for the Silverlight Runtime
-
- @class SilverlightRuntime
- @extends Runtime
- */
- function SilverlightRuntime(options) {
- var I = this, initTimer;
-
- options = Basic.extend({ xap_url: Env.xap_url }, options);
-
- Runtime.call(this, options, type, {
- access_binary: Runtime.capTrue,
- access_image_binary: Runtime.capTrue,
- display_media: Runtime.capTrue,
- do_cors: Runtime.capTrue,
- drag_and_drop: false,
- report_upload_progress: Runtime.capTrue,
- resize_image: Runtime.capTrue,
- return_response_headers: function(value) {
- return value && I.mode === 'client';
- },
- return_response_type: function(responseType) {
- if (responseType !== 'json') {
- return true;
- } else {
- return !!window.JSON;
- }
- },
- return_status_code: function(code) {
- return I.mode === 'client' || !Basic.arrayDiff(code, [200, 404]);
- },
- select_file: Runtime.capTrue,
- select_multiple: Runtime.capTrue,
- send_binary_string: Runtime.capTrue,
- send_browser_cookies: function(value) {
- return value && I.mode === 'browser';
- },
- send_custom_headers: function(value) {
- return value && I.mode === 'client';
- },
- send_multipart: Runtime.capTrue,
- slice_blob: Runtime.capTrue,
- stream_upload: true,
- summon_file_dialog: false,
- upload_filesize: Runtime.capTrue,
- use_http_method: function(methods) {
- return I.mode === 'client' || !Basic.arrayDiff(methods, ['GET', 'POST']);
- }
- }, {
- // capabilities that require specific mode
- return_response_headers: function(value) {
- return value ? 'client' : 'browser';
- },
- return_status_code: function(code) {
- return Basic.arrayDiff(code, [200, 404]) ? 'client' : ['client', 'browser'];
- },
- send_browser_cookies: function(value) {
- return value ? 'browser' : 'client';
- },
- send_custom_headers: function(value) {
- return value ? 'client' : 'browser';
- },
- use_http_method: function(methods) {
- return Basic.arrayDiff(methods, ['GET', 'POST']) ? 'client' : ['client', 'browser'];
- }
- });
-
-
- // minimal requirement
- if (!isInstalled('2.0.31005.0') || Env.browser === 'Opera') {
- this.mode = false;
- }
-
-
- Basic.extend(this, {
- getShim: function() {
- return Dom.get(this.uid).content.Moxie;
- },
-
- shimExec: function(component, action) {
- var args = [].slice.call(arguments, 2);
- return I.getShim().exec(this.uid, component, action, args);
- },
-
- init : function() {
- var container;
-
- container = this.getShimContainer();
-
- container.innerHTML = '' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ';
-
- // Init is dispatched by the shim
- initTimer = setTimeout(function() {
- if (I && !I.initialized) { // runtime might be already destroyed by this moment
- I.trigger("Error", new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR));
- }
- }, Env.OS !== 'Windows'? 10000 : 5000); // give it more time to initialize in non Windows OS (like Mac)
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- clearTimeout(initTimer); // initialization check might be still onwait
- options = initTimer = destroy = I = null;
- };
- }(this.destroy))
-
- }, extensions);
- }
-
- Runtime.addConstructor(type, SilverlightRuntime);
-
- return extensions;
-});
-
-// Included from: src/javascript/runtime/silverlight/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/file/Blob
-@private
-*/
-define("moxie/runtime/silverlight/file/Blob", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/file/Blob"
-], function(extensions, Basic, Blob) {
- return (extensions.Blob = Basic.extend({}, Blob));
-});
-
-// Included from: src/javascript/runtime/silverlight/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/file/FileInput
-@private
-*/
-define("moxie/runtime/silverlight/file/FileInput", [
- "moxie/runtime/silverlight/Runtime"
-], function(extensions) {
-
- var FileInput = {
- init: function(options) {
-
- function toFilters(accept) {
- var filter = '';
- for (var i = 0; i < accept.length; i++) {
- filter += (filter !== '' ? '|' : '') + accept[i].title + " | *." + accept[i].extensions.replace(/,/g, ';*.');
- }
- return filter;
- }
-
- this.getRuntime().shimExec.call(this, 'FileInput', 'init', toFilters(options.accept), options.name, options.multiple);
- this.trigger('ready');
- }
- };
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/silverlight/file/FileDrop.js
-
-/**
- * FileDrop.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/file/FileDrop
-@private
-*/
-define("moxie/runtime/silverlight/file/FileDrop", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events"
-], function(extensions, Dom, Events) {
-
- // not exactly useful, since works only in safari (...crickets...)
- var FileDrop = {
- init: function() {
- var comp = this, self = comp.getRuntime(), dropZone;
-
- dropZone = self.getShimContainer();
-
- Events.addEvent(dropZone, 'dragover', function(e) {
- e.preventDefault();
- e.stopPropagation();
- e.dataTransfer.dropEffect = 'copy';
- }, comp.uid);
-
- Events.addEvent(dropZone, 'dragenter', function(e) {
- e.preventDefault();
- var flag = Dom.get(self.uid).dragEnter(e);
- // If handled, then stop propagation of event in DOM
- if (flag) {
- e.stopPropagation();
- }
- }, comp.uid);
-
- Events.addEvent(dropZone, 'drop', function(e) {
- e.preventDefault();
- var flag = Dom.get(self.uid).dragDrop(e);
- // If handled, then stop propagation of event in DOM
- if (flag) {
- e.stopPropagation();
- }
- }, comp.uid);
-
- return self.shimExec.call(this, 'FileDrop', 'init');
- }
- };
-
- return (extensions.FileDrop = FileDrop);
-});
-
-// Included from: src/javascript/runtime/silverlight/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/file/FileReader
-@private
-*/
-define("moxie/runtime/silverlight/file/FileReader", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/file/FileReader"
-], function(extensions, Basic, FileReader) {
- return (extensions.FileReader = Basic.extend({}, FileReader));
-});
-
-// Included from: src/javascript/runtime/silverlight/file/FileReaderSync.js
-
-/**
- * FileReaderSync.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/file/FileReaderSync
-@private
-*/
-define("moxie/runtime/silverlight/file/FileReaderSync", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/file/FileReaderSync"
-], function(extensions, Basic, FileReaderSync) {
- return (extensions.FileReaderSync = Basic.extend({}, FileReaderSync));
-});
-
-// Included from: src/javascript/runtime/silverlight/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/silverlight/xhr/XMLHttpRequest", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/xhr/XMLHttpRequest"
-], function(extensions, Basic, XMLHttpRequest) {
- return (extensions.XMLHttpRequest = Basic.extend({}, XMLHttpRequest));
-});
-
-// Included from: src/javascript/runtime/silverlight/runtime/Transporter.js
-
-/**
- * Transporter.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/runtime/Transporter
-@private
-*/
-define("moxie/runtime/silverlight/runtime/Transporter", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/runtime/Transporter"
-], function(extensions, Basic, Transporter) {
- return (extensions.Transporter = Basic.extend({}, Transporter));
-});
-
-// Included from: src/javascript/runtime/silverlight/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/silverlight/image/Image
-@private
-*/
-define("moxie/runtime/silverlight/image/Image", [
- "moxie/runtime/silverlight/Runtime",
- "moxie/core/utils/Basic",
- "moxie/runtime/flash/image/Image"
-], function(extensions, Basic, Image) {
- return (extensions.Image = Basic.extend({}, Image, {
-
- getInfo: function() {
- var self = this.getRuntime()
- , grps = ['tiff', 'exif', 'gps']
- , info = { meta: {} }
- , rawInfo = self.shimExec.call(this, 'Image', 'getInfo')
- ;
-
- if (rawInfo.meta) {
- Basic.each(grps, function(grp) {
- var meta = rawInfo.meta[grp]
- , tag
- , i
- , length
- , value
- ;
- if (meta && meta.keys) {
- info.meta[grp] = {};
- for (i = 0, length = meta.keys.length; i < length; i++) {
- tag = meta.keys[i];
- value = meta[tag];
- if (value) {
- // convert numbers
- if (/^(\d|[1-9]\d+)$/.test(value)) { // integer (make sure doesn't start with zero)
- value = parseInt(value, 10);
- } else if (/^\d*\.\d+$/.test(value)) { // double
- value = parseFloat(value);
- }
- info.meta[grp][tag] = value;
- }
- }
- }
- });
- }
-
- info.width = parseInt(rawInfo.width, 10);
- info.height = parseInt(rawInfo.height, 10);
- info.size = parseInt(rawInfo.size, 10);
- info.type = rawInfo.type;
- info.name = rawInfo.name;
-
- return info;
- }
- }));
-});
-
-// Included from: src/javascript/runtime/html4/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global File:true */
-
-/**
-Defines constructor for HTML4 runtime.
-
-@class moxie/runtime/html4/Runtime
-@private
-*/
-define("moxie/runtime/html4/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime",
- "moxie/core/utils/Env"
-], function(Basic, x, Runtime, Env) {
-
- var type = 'html4', extensions = {};
-
- function Html4Runtime(options) {
- var I = this
- , Test = Runtime.capTest
- , True = Runtime.capTrue
- ;
-
- Runtime.call(this, options, type, {
- access_binary: Test(window.FileReader || window.File && File.getAsDataURL),
- access_image_binary: false,
- display_media: Test(extensions.Image && (Env.can('create_canvas') || Env.can('use_data_uri_over32kb'))),
- do_cors: false,
- drag_and_drop: false,
- filter_by_extension: Test(function() { // if you know how to feature-detect this, please suggest
- return (Env.browser === 'Chrome' && Env.version >= 28) || (Env.browser === 'IE' && Env.version >= 10);
- }()),
- resize_image: function() {
- return extensions.Image && I.can('access_binary') && Env.can('create_canvas');
- },
- report_upload_progress: false,
- return_response_headers: false,
- return_response_type: function(responseType) {
- if (responseType === 'json' && !!window.JSON) {
- return true;
- }
- return !!~Basic.inArray(responseType, ['text', 'document', '']);
- },
- return_status_code: function(code) {
- return !Basic.arrayDiff(code, [200, 404]);
- },
- select_file: function() {
- return Env.can('use_fileinput');
- },
- select_multiple: false,
- send_binary_string: false,
- send_custom_headers: false,
- send_multipart: true,
- slice_blob: false,
- stream_upload: function() {
- return I.can('select_file');
- },
- summon_file_dialog: Test(function() { // yeah... some dirty sniffing here...
- return (Env.browser === 'Firefox' && Env.version >= 4) ||
- (Env.browser === 'Opera' && Env.version >= 12) ||
- !!~Basic.inArray(Env.browser, ['Chrome', 'Safari']);
- }()),
- upload_filesize: True,
- use_http_method: function(methods) {
- return !Basic.arrayDiff(methods, ['GET', 'POST']);
- }
- });
-
-
- Basic.extend(this, {
- init : function() {
- this.trigger("Init");
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- destroy = I = null;
- };
- }(this.destroy))
- });
-
- Basic.extend(this.getShim(), extensions);
- }
-
- Runtime.addConstructor(type, Html4Runtime);
-
- return extensions;
-});
-
-// Included from: src/javascript/runtime/html4/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/file/FileInput
-@private
-*/
-define("moxie/runtime/html4/file/FileInput", [
- "moxie/runtime/html4/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, Basic, Dom, Events, Mime, Env) {
-
- function FileInput() {
- var _uid, _files = [], _mimes = [], _options;
-
- function addInput() {
- var comp = this, I = comp.getRuntime(), shimContainer, browseButton, currForm, form, input, uid;
-
- uid = Basic.guid('uid_');
-
- shimContainer = I.getShimContainer(); // we get new ref everytime to avoid memory leaks in IE
-
- if (_uid) { // move previous form out of the view
- currForm = Dom.get(_uid + '_form');
- if (currForm) {
- Basic.extend(currForm.style, { top: '100%' });
- }
- }
-
- // build form in DOM, since innerHTML version not able to submit file for some reason
- form = document.createElement('form');
- form.setAttribute('id', uid + '_form');
- form.setAttribute('method', 'post');
- form.setAttribute('enctype', 'multipart/form-data');
- form.setAttribute('encoding', 'multipart/form-data');
-
- Basic.extend(form.style, {
- overflow: 'hidden',
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
- input = document.createElement('input');
- input.setAttribute('id', uid);
- input.setAttribute('type', 'file');
- input.setAttribute('name', _options.name || 'Filedata');
- input.setAttribute('accept', _mimes.join(','));
-
- Basic.extend(input.style, {
- fontSize: '999px',
- opacity: 0
- });
-
- form.appendChild(input);
- shimContainer.appendChild(form);
-
- // prepare file input to be placed underneath the browse_button element
- Basic.extend(input.style, {
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
- if (Env.browser === 'IE' && Env.version < 10) {
- Basic.extend(input.style, {
- filter : "progid:DXImageTransform.Microsoft.Alpha(opacity=0)"
- });
- }
-
- input.onchange = function() { // there should be only one handler for this
- var file;
-
- if (!this.value) {
- return;
- }
-
- if (this.files) {
- file = this.files[0];
- } else {
- file = {
- name: this.value
- };
- }
-
- _files = [file];
-
- this.onchange = function() {}; // clear event handler
- addInput.call(comp);
-
- // after file is initialized as o.File, we need to update form and input ids
- comp.bind('change', function onChange() {
- var input = Dom.get(uid), form = Dom.get(uid + '_form'), file;
-
- comp.unbind('change', onChange);
-
- if (comp.files.length && input && form) {
- file = comp.files[0];
-
- input.setAttribute('id', file.uid);
- form.setAttribute('id', file.uid + '_form');
-
- // set upload target
- form.setAttribute('target', file.uid + '_iframe');
- }
- input = form = null;
- }, 998);
-
- input = form = null;
- comp.trigger('change');
- };
-
-
- // route click event to the input
- if (I.can('summon_file_dialog')) {
- browseButton = Dom.get(_options.browse_button);
- Events.removeEvent(browseButton, 'click', comp.uid);
- Events.addEvent(browseButton, 'click', function(e) {
- if (input && !input.disabled) { // for some reason FF (up to 8.0.1 so far) lets to click disabled input[type=file]
- input.click();
- }
- e.preventDefault();
- }, comp.uid);
- }
-
- _uid = uid;
-
- shimContainer = currForm = browseButton = null;
- }
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, I = comp.getRuntime(), shimContainer;
-
- // figure out accept string
- _options = options;
- _mimes = options.accept.mimes || Mime.extList2mimes(options.accept, I.can('filter_by_extension'));
-
- shimContainer = I.getShimContainer();
-
- (function() {
- var browseButton, zIndex, top;
-
- browseButton = Dom.get(options.browse_button);
-
- // Route click event to the input[type=file] element for browsers that support such behavior
- if (I.can('summon_file_dialog')) {
- if (Dom.getStyle(browseButton, 'position') === 'static') {
- browseButton.style.position = 'relative';
- }
-
- zIndex = parseInt(Dom.getStyle(browseButton, 'z-index'), 10) || 1;
-
- browseButton.style.zIndex = zIndex;
- shimContainer.style.zIndex = zIndex - 1;
- }
-
- /* Since we have to place input[type=file] on top of the browse_button for some browsers,
- browse_button loses interactivity, so we restore it here */
- top = I.can('summon_file_dialog') ? browseButton : shimContainer;
-
- Events.addEvent(top, 'mouseover', function() {
- comp.trigger('mouseenter');
- }, comp.uid);
-
- Events.addEvent(top, 'mouseout', function() {
- comp.trigger('mouseleave');
- }, comp.uid);
-
- Events.addEvent(top, 'mousedown', function() {
- comp.trigger('mousedown');
- }, comp.uid);
-
- Events.addEvent(Dom.get(options.container), 'mouseup', function() {
- comp.trigger('mouseup');
- }, comp.uid);
-
- browseButton = null;
- }());
-
- addInput.call(this);
-
- shimContainer = null;
-
- // trigger ready event asynchronously
- comp.trigger({
- type: 'ready',
- async: true
- });
- },
-
- getFiles: function() {
- return _files;
- },
-
- disable: function(state) {
- var input;
-
- if ((input = Dom.get(_uid))) {
- input.disabled = !!state;
- }
- },
-
- destroy: function() {
- var I = this.getRuntime()
- , shim = I.getShim()
- , shimContainer = I.getShimContainer()
- ;
-
- Events.removeAllEvents(shimContainer, this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.browse_button), this.uid);
-
- if (shimContainer) {
- shimContainer.innerHTML = '';
- }
-
- shim.removeInstance(this.uid);
-
- _uid = _files = _mimes = _options = shimContainer = shim = null;
- }
- });
- }
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/html4/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/file/FileReader
-@private
-*/
-define("moxie/runtime/html4/file/FileReader", [
- "moxie/runtime/html4/Runtime",
- "moxie/runtime/html5/file/FileReader"
-], function(extensions, FileReader) {
- return (extensions.FileReader = FileReader);
-});
-
-// Included from: src/javascript/runtime/html4/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/html4/xhr/XMLHttpRequest", [
- "moxie/runtime/html4/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Url",
- "moxie/core/Exceptions",
- "moxie/core/utils/Events",
- "moxie/file/Blob",
- "moxie/xhr/FormData"
-], function(extensions, Basic, Dom, Url, x, Events, Blob, FormData) {
-
- function XMLHttpRequest() {
- var _status, _response, _iframe;
-
- function cleanup(cb) {
- var target = this, uid, form, inputs, i, hasFile = false;
-
- if (!_iframe) {
- return;
- }
-
- uid = _iframe.id.replace(/_iframe$/, '');
-
- form = Dom.get(uid + '_form');
- if (form) {
- inputs = form.getElementsByTagName('input');
- i = inputs.length;
-
- while (i--) {
- switch (inputs[i].getAttribute('type')) {
- case 'hidden':
- inputs[i].parentNode.removeChild(inputs[i]);
- break;
- case 'file':
- hasFile = true; // flag the case for later
- break;
- }
- }
- inputs = [];
-
- if (!hasFile) { // we need to keep the form for sake of possible retries
- form.parentNode.removeChild(form);
- }
- form = null;
- }
-
- // without timeout, request is marked as canceled (in console)
- setTimeout(function() {
- Events.removeEvent(_iframe, 'load', target.uid);
- if (_iframe.parentNode) { // #382
- _iframe.parentNode.removeChild(_iframe);
- }
-
- // check if shim container has any other children, if - not, remove it as well
- var shimContainer = target.getRuntime().getShimContainer();
- if (!shimContainer.children.length) {
- shimContainer.parentNode.removeChild(shimContainer);
- }
-
- shimContainer = _iframe = null;
- cb();
- }, 1);
- }
-
- Basic.extend(this, {
- send: function(meta, data) {
- var target = this, I = target.getRuntime(), uid, form, input, blob;
-
- _status = _response = null;
-
- function createIframe() {
- var container = I.getShimContainer() || document.body
- , temp = document.createElement('div')
- ;
-
- // IE 6 won't be able to set the name using setAttribute or iframe.name
- temp.innerHTML = '';
- _iframe = temp.firstChild;
- container.appendChild(_iframe);
-
- /* _iframe.onreadystatechange = function() {
- console.info(_iframe.readyState);
- };*/
-
- Events.addEvent(_iframe, 'load', function() { // _iframe.onload doesn't work in IE lte 8
- var el;
-
- try {
- el = _iframe.contentWindow.document || _iframe.contentDocument || window.frames[_iframe.id].document;
-
- // try to detect some standard error pages
- if (/^4(0[0-9]|1[0-7]|2[2346])\s/.test(el.title)) { // test if title starts with 4xx HTTP error
- _status = el.title.replace(/^(\d+).*$/, '$1');
- } else {
- _status = 200;
- // get result
- _response = Basic.trim(el.body.innerHTML);
-
- // we need to fire these at least once
- target.trigger({
- type: 'progress',
- loaded: _response.length,
- total: _response.length
- });
-
- if (blob) { // if we were uploading a file
- target.trigger({
- type: 'uploadprogress',
- loaded: blob.size || 1025,
- total: blob.size || 1025
- });
- }
- }
- } catch (ex) {
- if (Url.hasSameOrigin(meta.url)) {
- // if response is sent with error code, iframe in IE gets redirected to res://ieframe.dll/http_x.htm
- // which obviously results to cross domain error (wtf?)
- _status = 404;
- } else {
- cleanup.call(target, function() {
- target.trigger('error');
- });
- return;
- }
- }
-
- cleanup.call(target, function() {
- target.trigger('load');
- });
- }, target.uid);
- } // end createIframe
-
- // prepare data to be sent and convert if required
- if (data instanceof FormData && data.hasBlob()) {
- blob = data.getBlob();
- uid = blob.uid;
- input = Dom.get(uid);
- form = Dom.get(uid + '_form');
- if (!form) {
- throw new x.DOMException(x.DOMException.NOT_FOUND_ERR);
- }
- } else {
- uid = Basic.guid('uid_');
-
- form = document.createElement('form');
- form.setAttribute('id', uid + '_form');
- form.setAttribute('method', meta.method);
- form.setAttribute('enctype', 'multipart/form-data');
- form.setAttribute('encoding', 'multipart/form-data');
- form.setAttribute('target', uid + '_iframe');
-
- I.getShimContainer().appendChild(form);
- }
-
- if (data instanceof FormData) {
- data.each(function(value, name) {
- if (value instanceof Blob) {
- if (input) {
- input.setAttribute('name', name);
- }
- } else {
- var hidden = document.createElement('input');
-
- Basic.extend(hidden, {
- type : 'hidden',
- name : name,
- value : value
- });
-
- // make sure that input[type="file"], if it's there, comes last
- if (input) {
- form.insertBefore(hidden, input);
- } else {
- form.appendChild(hidden);
- }
- }
- });
- }
-
- // set destination url
- form.setAttribute("action", meta.url);
-
- createIframe();
- form.submit();
- target.trigger('loadstart');
- },
-
- getStatus: function() {
- return _status;
- },
-
- getResponse: function(responseType) {
- if ('json' === responseType) {
- // strip off .. tags that might be enclosing the response
- if (Basic.typeOf(_response) === 'string' && !!window.JSON) {
- try {
- return JSON.parse(_response.replace(/^\s*]*>/, '').replace(/<\/pre>\s*$/, ''));
- } catch (ex) {
- return null;
- }
- }
- } else if ('document' === responseType) {
-
- }
- return _response;
- },
-
- abort: function() {
- var target = this;
-
- if (_iframe && _iframe.contentWindow) {
- if (_iframe.contentWindow.stop) { // FireFox/Safari/Chrome
- _iframe.contentWindow.stop();
- } else if (_iframe.contentWindow.document.execCommand) { // IE
- _iframe.contentWindow.document.execCommand('Stop');
- } else {
- _iframe.src = "about:blank";
- }
- }
-
- cleanup.call(this, function() {
- // target.dispatchEvent('readystatechange');
- target.dispatchEvent('abort');
- });
- }
- });
- }
-
- return (extensions.XMLHttpRequest = XMLHttpRequest);
-});
-
-// Included from: src/javascript/runtime/html4/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/image/Image
-@private
-*/
-define("moxie/runtime/html4/image/Image", [
- "moxie/runtime/html4/Runtime",
- "moxie/runtime/html5/image/Image"
-], function(extensions, Image) {
- return (extensions.Image = Image);
-});
-
-expose(["moxie/core/utils/Basic","moxie/core/I18n","moxie/core/utils/Mime","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/file/File","moxie/file/FileInput","moxie/file/FileDrop","moxie/runtime/RuntimeTarget","moxie/file/FileReader","moxie/core/utils/Url","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/runtime/Transporter","moxie/image/Image","moxie/core/utils/Events"]);
-})(this);/**
- * o.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global moxie:true */
-
-/**
-Globally exposed namespace with the most frequently used public classes and handy methods.
-
-@class o
-@static
-@private
-*/
-(function() {
- "use strict";
-
- var o = {}, inArray = moxie.core.utils.Basic.inArray;
-
- // directly add some public classes
- // (we do it dynamically here, since for custom builds we cannot know beforehand what modules were included)
- (function addAlias(ns) {
- var name, itemType;
- for (name in ns) {
- itemType = typeof(ns[name]);
- if (itemType === 'object' && !~inArray(name, ['Exceptions', 'Env', 'Mime'])) {
- addAlias(ns[name]);
- } else if (itemType === 'function') {
- o[name] = ns[name];
- }
- }
- })(window.moxie);
-
- // add some manually
- o.Env = window.moxie.core.utils.Env;
- o.Mime = window.moxie.core.utils.Mime;
- o.Exceptions = window.moxie.core.Exceptions;
-
- // expose globally
- window.mOxie = o;
- if (!window.o) {
- window.o = o;
- }
- return o;
-})();
diff --git a/demo/js/plupload/moxie.min.js b/demo/js/plupload/moxie.min.js
deleted file mode 100644
index 99e119ef..00000000
--- a/demo/js/plupload/moxie.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill
- * v1.2.0
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-!function(e,t){"use strict";function n(e,t){for(var n,i=[],r=0;r0&&n(o,function(n,o){n!==r&&(e(i[o])===e(n)&&~a(e(n),["array","object"])?t(i[o],n):i[o]=n)})}),i},n=function(e,t){var n,i,r,o;if(e){try{n=e.length}catch(a){n=o}if(n===o){for(i in e)if(e.hasOwnProperty(i)&&t(e[i],i)===!1)return}else for(r=0;n>r;r++)if(t(e[r],r)===!1)return}},i=function(t){var n;if(!t||"object"!==e(t))return!0;for(n in t)return!1;return!0},r=function(t,n){function i(r){"function"===e(t[r])&&t[r](function(e){++rn;n++)if(t[n]===e)return n}return-1},s=function(t,n){var i=[];"array"!==e(t)&&(t=[t]),"array"!==e(n)&&(n=[n]);for(var r in t)-1===a(t[r],n)&&i.push(t[r]);return i.length?i:!1},u=function(e,t){var i=[];return n(e,function(e){-1!==a(e,t)&&i.push(e)}),i.length?i:null},c=function(e){var t,n=[];for(t=0;ti;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}(),d=function(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e},f=function(e){if("string"!=typeof e)return e;var t={t:1099511627776,g:1073741824,m:1048576,k:1024},n;return e=/^([0-9]+)([mgk]?)$/.exec(e.toLowerCase().replace(/[^0-9mkg]/g,"")),n=e[2],e=+e[1],t.hasOwnProperty(n)&&(e*=t[n]),e};return{guid:l,typeOf:e,extend:t,each:n,isEmptyObj:i,inSeries:r,inParallel:o,inArray:a,arrayDiff:s,arrayIntersect:u,toArray:c,trim:d,parseSizeStr:f}}),i(c,[u],function(e){var t={};return{addI18n:function(n){return e.extend(t,n)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var n=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=n.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),i(l,[u,c],function(e,t){var n="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",i={mimes:{},extensions:{},addMimeType:function(e){var t=e.split(/,/),n,i,r;for(n=0;ni;i++)if(e[i]!=t[i]){if(e[i]=u(e[i]),t[i]=u(t[i]),e[i]t[i]){o=1;break}}if(!n)return o;switch(n){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",n="?",i="function",r="undefined",o="object",a="major",s="model",u="name",c="type",l="vendor",d="version",f="architecture",p="console",h="mobile",m="tablet",g={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},v={rgx:function(){for(var t,n=0,a,s,u,c,l,d,f=arguments;n0?2==c.length?t[c[0]]=typeof c[1]==i?c[1].call(this,d):c[1]:3==c.length?t[c[0]]=typeof c[1]!==i||c[1].exec&&c[1].test?d?d.replace(c[1],c[2]):e:d?c[1].call(this,d,c[2]):e:4==c.length&&(t[c[0]]=d?c[3].call(this,d.replace(c[1],c[2])):e):t[c]=d?d:e;break}if(l)break}return t},str:function(t,i){for(var r in i)if(typeof i[r]===o&&i[r].length>0){for(var a=0;a=9)},use_data_uri_of:function(e){return t.use_data_uri&&33e3>e||t.use_data_uri_over32kb()},use_fileinput:function(){var e=document.createElement("input");return e.setAttribute("type","file"),!e.disabled}};return function(n){var i=[].slice.call(arguments);return i.shift(),"function"===e.typeOf(t[n])?t[n].apply(this,i):!!t[n]}}(),r={can:i,browser:n.browser.name,version:parseFloat(n.browser.major),os:n.os.name,osVersion:n.os.version,verComp:t,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return r.OS=r.os,r}),i(f,[d],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},n=function(e,t){if(!e.className)return!1;var n=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return n.test(e.className)},i=function(e,t){n(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var n=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(n,function(e,t,n){return" "===t&&" "===n?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,n){function i(e){var t,n,i=0,r=0;return e&&(n=e.getBoundingClientRect(),t="CSS1Compat"===s.compatMode?s.documentElement:s.body,i=n.left+t.scrollLeft,r=n.top+t.scrollTop),{x:i,y:r}}var r=0,o=0,a,s=document,u,c;if(t=t,n=n||s.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!s.documentMode||s.documentMode<8))return u=i(t),c=i(n),{x:u.x-c.x,y:u.y-c.y};for(a=t;a&&a!=n&&a.nodeType;)r+=a.offsetLeft||0,o+=a.offsetTop||0,a=a.offsetParent;for(a=t.parentNode;a&&a!=n&&a.nodeType;)r-=a.scrollLeft||0,o-=a.scrollTop||0,a=a.parentNode;return{x:r,y:o}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:n,addClass:i,removeClass:r,getStyle:o,getPos:a,getSize:s}}),i(p,[u],function(e){function t(e,t){var n;for(n in e)if(e[n]===t)return n;return null}return{RuntimeError:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": RuntimeError "+this.code}var i={NOT_INIT_ERR:1,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(n,i),n.prototype=Error.prototype,n}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": ImageError "+this.code}var i={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2};return e.extend(n,i),n.prototype=Error.prototype,n}(),FileException:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": FileException "+this.code}var i={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(n,i),n.prototype=Error.prototype,n}(),DOMException:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": DOMException "+this.code}var i={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(n,i),n.prototype=Error.prototype,n}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),i(h,[p,u],function(e,t){function n(){var n={};t.extend(this,{uid:null,init:function(){this.uid||(this.uid=t.guid("uid_"))},addEventListener:function(e,i,r,o){var a=this,s;return e=t.trim(e),/\s/.test(e)?(t.each(e.split(/\s+/),function(e){a.addEventListener(e,i,r,o)}),void 0):(e=e.toLowerCase(),r=parseInt(r,10)||0,s=n[this.uid]&&n[this.uid][e]||[],s.push({fn:i,priority:r,scope:o||this}),n[this.uid]||(n[this.uid]={}),n[this.uid][e]=s,void 0)},hasEventListener:function(e){return e?!(!n[this.uid]||!n[this.uid][e]):!!n[this.uid]},removeEventListener:function(e,i){e=e.toLowerCase();var r=n[this.uid]&&n[this.uid][e],o;if(r){if(i){for(o=r.length-1;o>=0;o--)if(r[o].fn===i){r.splice(o,1);break}}else r=[];r.length||(delete n[this.uid][e],t.isEmptyObj(n[this.uid])&&delete n[this.uid])}},removeAllEventListeners:function(){n[this.uid]&&delete n[this.uid]},dispatchEvent:function(i){var r,o,a,s,u={},c=!0,l;if("string"!==t.typeOf(i)){if(s=i,"string"!==t.typeOf(s.type))throw new e.EventException(e.EventException.UNSPECIFIED_EVENT_TYPE_ERR);i=s.type,s.total!==l&&s.loaded!==l&&(u.total=s.total,u.loaded=s.loaded),u.async=s.async||!1}if(-1!==i.indexOf("::")?function(e){r=e[0],i=e[1]}(i.split("::")):r=this.uid,i=i.toLowerCase(),o=n[r]&&n[r][i]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),u.type=i,a.unshift(u);var d=[];t.each(o,function(e){a[0].target=e.scope,u.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&t.inSeries(d,function(e){c=!e})}return c},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},convertEventPropsToHandlers:function(e){var n;"array"!==t.typeOf(e)&&(e=[e]);for(var i=0;i>16,o=255&d>>8,a=255&d,m[p++]=64==c?String.fromCharCode(r):64==l?String.fromCharCode(r,o):String.fromCharCode(r,o,a);while(f>18,u=63&d>>12,c=63&d>>6,l=63&d,m[p++]=i.charAt(s)+i.charAt(u)+i.charAt(c)+i.charAt(l);while(fa;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return i.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return i.call(this,"readAsDataURL",e)},readAsText:function(e){return i.call(this,"readAsText",e)}})}}),i(S,[p,u,y],function(e,t,n){function i(){var e,i=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof n?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):i.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(n){t.each(i,function(e){n(e.value,e.name)}),e&&n(e.value,e.name)},destroy:function(){e=null,i=[]}})}return i}),i(A,[u,p,h,m,b,g,x,y,T,S,d,l],function(e,t,n,i,r,o,a,s,u,c,l,d){function f(){this.uid=e.guid("uid_")}function p(){function n(e,t){return y.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?y[e]:v[e]:(l.can("define_property")?y[e]=t:v[e]=t,void 0):void 0}function u(t){function i(){k.destroy(),k=null,s.dispatchEvent("loadend"),s=null}function r(r){k.bind("LoadStart",function(e){n("readyState",p.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),I&&s.upload.dispatchEvent(e)}),k.bind("Progress",function(e){n("readyState")!==p.LOADING&&(n("readyState",p.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),k.bind("UploadProgress",function(e){I&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),k.bind("Load",function(t){n("readyState",p.DONE),n("status",Number(r.exec.call(k,"XMLHttpRequest","getStatus")||0)),n("statusText",h[n("status")]||""),n("response",r.exec.call(k,"XMLHttpRequest","getResponse",n("responseType"))),~e.inArray(n("responseType"),["text",""])?n("responseText",n("response")):"document"===n("responseType")&&n("responseXML",n("response")),U=r.exec.call(k,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),n("status")>0?(I&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(N=!0,s.dispatchEvent("error")),i()}),k.bind("Abort",function(e){s.dispatchEvent(e),i()}),k.bind("Error",function(e){N=!0,n("readyState",p.DONE),s.dispatchEvent("readystatechange"),D=!0,s.dispatchEvent(e),i()}),r.exec.call(k,"XMLHttpRequest","send",{url:E,method:_,async:w,user:R,password:b,headers:x,mimeType:S,encoding:T,responseType:s.responseType,withCredentials:s.withCredentials,options:P},t)}var s=this;M=(new Date).getTime(),k=new a,"string"==typeof P.required_caps&&(P.required_caps=o.parseCaps(P.required_caps)),P.required_caps=e.extend({},P.required_caps,{return_response_type:s.responseType}),t instanceof c&&(P.required_caps.send_multipart=!0),L||(P.required_caps.do_cors=!0),P.ruid?r(k.connectRuntime(P)):(k.bind("RuntimeInit",function(e,t){r(t)}),k.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),k.connectRuntime(P))}function g(){n("responseText",""),n("responseXML",null),n("response",null),n("status",0),n("statusText",""),M=C=null}var v=this,y={timeout:0,readyState:p.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},w=!0,E,_,x={},R,b,T=null,S=null,A=!1,O=!1,I=!1,D=!1,N=!1,L=!1,M,C,F=null,H=null,P={},k,U="",B;e.extend(this,y,{uid:e.guid("uid_"),upload:new f,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||i.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(_=o.toUpperCase()),~e.inArray(_,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=i.utf8_encode(a),l=r.parseUrl(a),L=r.hasSameOrigin(l),E=r.resolveUrl(a),(u||c)&&!L)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(R=u||l.user,b=c||l.pass,w=s||!0,w===!1&&(n("timeout")||n("withCredentials")||""!==n("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);A=!w,O=!1,x={},g.call(this),n("readyState",p.OPENED),this.convertEventPropsToHandlers(["readystatechange"]),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(n("readyState")!==p.OPENED||O)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||i.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(x[r]?x[r]+=", "+o:x[r]=o,!0)},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),N||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(B||(B={},e.each(U.split(/\r\n/),function(t){var n=t.split(/:\s+/);2===n.length&&(n[0]=e.trim(n[0]),B[n[0].toLowerCase()]={header:n[0],value:e.trim(n[1])})})),B.hasOwnProperty(t))?B[t].header+": "+B[t].value:null},overrideMimeType:function(i){var r,o;if(~e.inArray(n("readyState"),[p.LOADING,p.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i=e.trim(i.toLowerCase()),/;/.test(i)&&(r=i.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(i=r[1],r[2]&&(o=r[2])),!d.mimes[i])throw new t.DOMException(t.DOMException.SYNTAX_ERR);F=i,H=o},send:function(n,r){if(P="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.convertEventPropsToHandlers(m),this.upload.convertEventPropsToHandlers(m),this.readyState!==p.OPENED||O)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n instanceof s)P.ruid=n.ruid,S=n.type||"application/octet-stream";else if(n instanceof c){if(n.hasBlob()){var o=n.getBlob();P.ruid=o.ruid,S=o.type||"application/octet-stream"}}else"string"==typeof n&&(T="UTF-8",S="text/plain;charset=UTF-8",n=i.utf8_encode(n));this.withCredentials||(this.withCredentials=P.required_caps&&P.required_caps.send_browser_cookies&&!L),I=!A&&this.upload.hasEventListener(),N=!1,D=!n,A||(O=!0),u.call(this,n)},abort:function(){if(N=!0,A=!1,~e.inArray(n("readyState"),[p.UNSENT,p.OPENED,p.DONE]))n("readyState",p.UNSENT);else{if(n("readyState",p.DONE),O=!1,!k)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);k.getRuntime().exec.call(k,"XMLHttpRequest","abort",D),D=!0}},destroy:function(){k&&("function"===e.typeOf(k.destroy)&&k.destroy(),k=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}})}var h={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};f.prototype=n.instance;var m=["loadstart","progress","abort","error","load","timeout","loadend"],g=1,v=2;return p.UNSENT=0,p.OPENED=1,p.HEADERS_RECEIVED=2,p.LOADING=3,p.DONE=4,p.prototype=n.instance,p}),i(O,[u,m,v,h],function(e,t,n,i){function r(){function i(){l=d=0,c=this.result=null}function o(t,n){var i=this;u=n,i.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(i.state,[r.IDLE,r.DONE])&&a.call(i)},999),i.bind("TransportingComplete",function(){d=l,i.state=r.DONE,c=null,i.result=u.exec.call(i,"Transporter","getAsBlob",t||"")},999),i.state=r.BUSY,i.trigger("TransportingStarted"),a.call(i)}function a(){var e=this,n,i=l-d;f>i&&(f=i),n=t.btoa(c.substr(d,f)),u.exec.call(e,"Transporter","receive",n,l)}var s,u,c,l,d,f;n.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,n,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),f=r.chunk_size,i.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,n,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,n,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),i.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),i.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=i.instance,r}),i(I,[u,f,p,T,A,g,v,O,d,h,y,w,m],function(e,t,n,i,r,o,a,s,u,c,l,d,f){function p(){function i(e){e||(e=this.getRuntime().exec.call(this,"Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name)}function c(t){var i=e.typeOf(t);try{if(t instanceof p){if(!t.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);m.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new n.ImageError(n.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(i,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===i)/^data:[^;]*;base64,/.test(t)?c.call(this,new l(null,{data:t}),arguments[1]):v.apply(this,arguments);else{if("node"!==i||"img"!==t.nodeName.toLowerCase())throw new n.DOMException(n.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r)}}function m(t,n){var i=this.connectRuntime(t.ruid);this.ruid=i.uid,i.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(n)?!0:n)}function g(t,n){function i(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){i(t)}),n&&"string"==typeof n.required_caps&&(n.required_caps=o.parseCaps(n.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},n))):i(this.connectRuntime(t.ruid))}function v(e,t){var n=this,i;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){this.bind("Load Resize",function(){i.call(this)},999),this.convertEventPropsToHandlers(h),c.apply(this,arguments)},downsize:function(t,i,r,o){try{if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);if(this.width>p.MAX_RESIZE_WIDTH||this.height>p.MAX_RESIZE_HEIGHT)throw new n.ImageError(n.ImageError.MAX_RESOLUTION_ERR);(!t&&!i||"undefined"===e.typeOf(r))&&(r=!1),t=t||this.width,i=i||this.height,o="undefined"===e.typeOf(o)?!0:!!o,this.getRuntime().exec.call(this,"Image","downsize",t,i,r,o)}catch(a){this.trigger("error",a)}},crop:function(e,t,n){this.downsize(e,t,!0,n)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);var e=this.connectRuntime(this.ruid);return e.exec.call(this,"Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return e||(e="image/jpeg"),"image/jpeg"!==e||t||(t=90),this.getRuntime().exec.call(this,"Image","getAsBlob",e,t)},getAsDataURL:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return this.getRuntime().exec.call(this,"Image","getAsDataURL",e,t)},getAsBinaryString:function(e,t){var n=this.getAsDataURL(e,t);return f.atob(n.substring(n.indexOf("base64,")+7))},embed:function(i){function r(){if(u.can("create_canvas")){var t=a.getAsCanvas();if(t)return i.appendChild(t),t=null,a.destroy(),o.trigger("embedded"),void 0}var r=a.getAsDataURL(c,l);if(!r)throw new n.ImageError(n.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",r.length))i.innerHTML=' ',a.destroy(),o.trigger("embedded");else{var d=new s;d.bind("TransportingComplete",function(){v=o.connectRuntime(this.result.ruid),o.bind("Embedded",function(){e.extend(v.getShimContainer().style,{top:"0px",left:"0px",width:a.width+"px",height:a.height+"px"}),v=null},999),v.exec.call(o,"ImageView","display",this.result.uid,m,g),a.destroy()}),d.transport(f.atob(r.substring(r.indexOf("base64,")+7)),c,e.extend({},h,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:i}))}}var o=this,a,c,l,d,h=arguments[1]||{},m=this.width,g=this.height,v;try{if(!(i=t.get(i)))throw new n.DOMException(n.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);if(this.width>p.MAX_RESIZE_WIDTH||this.height>p.MAX_RESIZE_HEIGHT)throw new n.ImageError(n.ImageError.MAX_RESOLUTION_ERR);if(c=h.type||this.type||"image/jpeg",l=h.quality||90,d="undefined"!==e.typeOf(h.crop)?h.crop:!1,h.width)m=h.width,g=h.height||m;else{var y=t.getSize(i);y.w&&y.h&&(m=y.w,g=y.h)}return a=new p,a.bind("Resize",function(){r.call(o)}),a.bind("Load",function(){a.downsize(m,g,d,!1)}),a.clone(this,!1),a}catch(w){this.trigger("error",w)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.unbindAll()}})}var h=["progress","load","error","resize","embedded"];return p.MAX_RESIZE_WIDTH=6500,p.MAX_RESIZE_HEIGHT=6500,p.prototype=c.instance,p}),i(D,[u,p,g,d],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue,c=e.extend({access_binary:s(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return r.can("access_binary")&&!!a.Image},display_media:s(i.can("create_canvas")||i.can("use_data_uri_over32kb")),do_cors:s(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:s(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==i.browser||i.version>9)}()),filter_by_extension:s(function(){return"Chrome"===i.browser&&i.version>=28||"IE"===i.browser&&i.version>=10}()),return_response_headers:u,return_response_type:function(e){return"json"===e&&window.JSON?!0:i.can("return_response_type",e)},return_status_code:u,report_upload_progress:s(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return r.can("access_binary")&&i.can("create_canvas")},select_file:function(){return i.can("use_fileinput")&&window.File},select_folder:function(){return r.can("select_file")&&"Chrome"===i.browser&&i.version>=21},select_multiple:function(){return!(!r.can("select_file")||"Safari"===i.browser&&"Windows"===i.os||"iOS"===i.os&&i.verComp(i.osVersion,"7.0.4","<"))},send_binary_string:s(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:s(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||r.can("send_binary_string")},slice_blob:s(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return r.can("slice_blob")&&r.can("send_multipart")},summon_file_dialog:s(function(){return"Firefox"===i.browser&&i.version>=4||"Opera"===i.browser&&i.version>=12||"IE"===i.browser&&i.version>=10||!!~e.inArray(i.browser,["Chrome","Safari"])}()),upload_filesize:u},arguments[2]);n.call(this,t,arguments[1]||o,c),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html5",a={};return n.addConstructor(o,r),a}),i(N,[D,y],function(e,t){function n(){function e(e,t,n){var i;if(!window.File.prototype.slice)return(i=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?i.call(e,t,n):null;try{return e.slice(),e.slice(t,n)}catch(r){return e.slice(t,n-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))}}return e.Blob=n}),i(L,[u],function(e){function t(){this.returnValue=!1}function n(){this.cancelBubble=!0}var i={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=n,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),i.hasOwnProperty(o[r])||(i[o[r]]={}),l=i[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,n,o){var a,s;if(n=n.toLowerCase(),t[r]&&i[t[r]]&&i[t[r]][n]){a=i[t[r]][n];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(n,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+n,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete i[t[r]][n],e.isEmptyObj(i[t[r]])){delete i[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,n){t&&t[r]&&e.each(i[t[r]],function(e,i){a(t,i,n)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),i(M,[D,u,f,L,l,d],function(e,t,n,i,r,o){function a(){var e=[],a;t.extend(this,{init:function(s){var u=this,c=u.getRuntime(),l,d,f,p,h,m;a=s,e=[],f=a.accept.mimes||r.extList2mimes(a.accept,c.can("filter_by_extension")),d=c.getShimContainer(),d.innerHTML=' ",l=n.get(c.uid),t.extend(l.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),p=n.get(a.browse_button),c.can("summon_file_dialog")&&("static"===n.getStyle(p,"position")&&(p.style.position="relative"),h=parseInt(n.getStyle(p,"z-index"),10)||1,p.style.zIndex=h,d.style.zIndex=h-1,i.addEvent(p,"click",function(e){var t=n.get(c.uid);t&&!t.disabled&&t.click(),e.preventDefault()},u.uid)),m=c.can("summon_file_dialog")?p:d,i.addEvent(m,"mouseover",function(){u.trigger("mouseenter")},u.uid),i.addEvent(m,"mouseout",function(){u.trigger("mouseleave")},u.uid),i.addEvent(m,"mousedown",function(){u.trigger("mousedown")},u.uid),i.addEvent(n.get(a.container),"mouseup",function(){u.trigger("mouseup")},u.uid),l.onchange=function g(){if(e=[],a.directory?t.each(this.files,function(t){"."!==t.name&&e.push(t)}):e=[].slice.call(this.files),"IE"!==o.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=g}u.trigger("change")},u.trigger({type:"ready",async:!0}),d=null},getFiles:function(){return e},disable:function(e){var t=this.getRuntime(),i;(i=n.get(t.uid))&&(i.disabled=!!e)},destroy:function(){var t=this.getRuntime(),r=t.getShim(),o=t.getShimContainer();i.removeAllEvents(o,this.uid),i.removeAllEvents(a&&n.get(a.container),this.uid),i.removeAllEvents(a&&n.get(a.browse_button),this.uid),o&&(o.innerHTML=""),r.removeInstance(this.uid),e=a=o=r=null}})}return e.FileInput=a}),i(C,[D,u,f,L,l],function(e,t,n,i,r){function o(){function e(e){for(var n=[],i=0;i=4&&u.version<7,f="Android Browser"===u.browser,m=!1;if(h=n.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),p=c(),p.open(n.method,n.url,n.async,n.user,n.password),r instanceof o)r.isDetached()&&(m=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),m=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,n,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}p.upload?(n.withCredentials&&(p.withCredentials=!0),p.addEventListener("load",function(e){s.trigger(e)}),p.addEventListener("error",function(e){s.trigger(e)}),p.addEventListener("progress",function(e){s.trigger(e)}),p.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):p.onreadystatechange=function v(){switch(p.readyState){case 1:break;case 2:break;case 3:var e,t;try{i.hasSameOrigin(n.url)&&(e=p.getResponseHeader("Content-Length")||0),p.responseText&&(t=p.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:p.onreadystatechange=function(){},0===p.status?s.trigger("error"):s.trigger("load")}},t.isEmptyObj(n.headers)||t.each(n.headers,function(e,t){p.setRequestHeader(t,e)}),""!==n.responseType&&"responseType"in p&&(p.responseType="json"!==n.responseType||u.can("return_response_type","json")?n.responseType:"text"),m?p.sendAsBinary?p.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;ta;a++)i|=o.charCodeAt(e+a)<s;s++)o+=String.fromCharCode(255&t>>Math.abs(a+8*s));n(o,e,i)}var r=!1,o;return{II:function(e){return e===t?r:(r=e,void 0)},init:function(e){r=!1,o=e},SEGMENT:function(e,t,i){switch(arguments.length){case 1:return o.substr(e,o.length-e-1);case 2:return o.substr(e,t);case 3:n(i,e,t);break;default:return o}},BYTE:function(t){return e(t,1)},SHORT:function(t){return e(t,2)},LONG:function(n,r){return r===t?e(n,4):(i(n,r,4),void 0)},SLONG:function(t){var n=e(t,4);return n>2147483647?n-4294967296:n},STRING:function(t,n){var i="";for(n+=t;n>t;t++)i+=String.fromCharCode(e(t,1));return i}}}}),i(k,[P],function(e){return function t(n){var i=[],r,o,a,s=0;if(r=new e,r.init(n),65496===r.SHORT(0)){for(o=2;o<=n.length;)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;s=r.SHORT(o+2)+2,a>=65505&&65519>=a&&i.push({hex:a,name:"APP"+(15&a),start:o,length:s,segment:r.SEGMENT(o,s)}),o+=s}return r.init(null),{headers:i,restore:function(e){var t,n;for(r.init(e),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,t=i.length;t>n;n++)r.SEGMENT(o,0,i[n].segment),o+=i[n].length;return e=r.SEGMENT(),r.init(null),e},strip:function(e){var n,i,o;for(i=new t(e),n=i.headers,i.purge(),r.init(e),o=n.length;o--;)r.SEGMENT(n[o].start,n[o].length,"");return e=r.SEGMENT(),r.init(null),e},get:function(e){for(var t=[],n=0,r=i.length;r>n;n++)i[n].name===e.toUpperCase()&&t.push(i[n].segment);return t},set:function(e,t){var n=[],r,o,a;for("string"==typeof t?n.push(t):n=t,r=o=0,a=i.length;a>r&&(i[r].name===e.toUpperCase()&&(i[r].segment=n[o],i[r].length=n[o].length,o++),!(o>=n.length));r++);},purge:function(){i=[],r.init(null),r=null}}}}}),i(U,[u,P],function(e,n){return function i(){function i(e,n){var i=a.SHORT(e),r,o,s,u,d,f,p,h,m=[],g={};for(r=0;i>r;r++)if(p=f=e+12*r+2,s=n[a.SHORT(p)],s!==t){switch(u=a.SHORT(p+=2),d=a.LONG(p+=2),p+=4,m=[],u){case 1:case 7:for(d>4&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.BYTE(p+o);break;case 2:d>4&&(p=a.LONG(p)+c.tiffHeader),g[s]=a.STRING(p,d-1);continue;case 3:for(d>2&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.SHORT(p+2*o);break;case 4:for(d>1&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.LONG(p+4*o);break;case 5:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.LONG(p+4*o)/a.LONG(p+4*o+4);break;case 9:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.SLONG(p+4*o);break;case 10:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.SLONG(p+4*o)/a.SLONG(p+4*o+4);break;default:continue}h=1==d?m[0]:m,g[s]=l.hasOwnProperty(s)&&"object"!=typeof h?l[s][h]:h}return g}function r(){var e=c.tiffHeader;return a.II(18761==a.SHORT(e)),42!==a.SHORT(e+=2)?!1:(c.IFD0=c.tiffHeader+a.LONG(e+=2),u=i(c.IFD0,s.tiff),"ExifIFDPointer"in u&&(c.exifIFD=c.tiffHeader+u.ExifIFDPointer,delete u.ExifIFDPointer),"GPSInfoIFDPointer"in u&&(c.gpsIFD=c.tiffHeader+u.GPSInfoIFDPointer,delete u.GPSInfoIFDPointer),!0)}function o(e,t,n){var i,r,o,u=0;if("string"==typeof t){var l=s[e.toLowerCase()];for(var d in l)if(l[d]===t){t=d;break}}i=c[e.toLowerCase()+"IFD"],r=a.SHORT(i);for(var f=0;r>f;f++)if(o=i+12*f+2,a.SHORT(o)==t){u=o+8;break}return u?(a.LONG(u,n),!0):!1}var a,s,u,c={},l;return a=new n,s={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire.",1:"Flash fired.",5:"Strobe return light not detected.",7:"Strobe return light detected.",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},{init:function(e){return c={tiffHeader:10},e!==t&&e.length?(a.init(e),65505===a.SHORT(0)&&"EXIF\0"===a.STRING(4,5).toUpperCase()?r():!1):!1
-},TIFF:function(){return u},EXIF:function(){var t;if(t=i(c.exifIFD,s.exif),t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n=65472&&65475>=t)return e+=5,{height:c.SHORT(e),width:c.SHORT(e+=2)};n=c.SHORT(e+=2),e+=n-2}return null}function s(){d&&l&&c&&(d.purge(),l.purge(),c.init(null),u=f=l=d=c=null)}var u,c,l,d,f,p;if(u=o,c=new i,c.init(u),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new n(o),d=new r,p=!!d.init(l.get("app1")[0]),f=a.call(this),e.extend(this,{type:"image/jpeg",size:u.length,width:f&&f.width||0,height:f&&f.height||0,setExif:function(t,n){return p?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,n),l.set("app1",d.getBinary()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):u=l.restore(u)},stripHeaders:function(e){return l.strip(e)},purge:function(){s.call(this)}}),p&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS()})}return o}),i(z,[p,u,P],function(e,t,n){function i(i){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:u.LONG(t),height:u.LONG(t+=4)}):null}function o(){u&&(u.init(null),s=d=c=l=u=null)}function a(e){var t,n,i,r;return t=u.LONG(e),n=u.STRING(e+=4,4),i=e+=4,r=u.LONG(e+t),{length:t,type:n,start:i,CRC:r}}var s,u,c,l,d;s=i,u=new n,u.init(s),function(){var t=0,n=0,i=[35152,20039,3338,6666];for(n=0;ng;){for(var v=g+f>a?a-g:f,y=0;o>y;){var w=y+f>o?o-y:f;h.clearRect(0,0,f,f),h.drawImage(e,-y,-g);var E=y*s/o+c<<0,_=Math.ceil(w*s/o),x=g*u/a/m+l<<0,R=Math.ceil(v*u/a/m);d.drawImage(p,0,0,w,v,E,x,_,R),y+=f}g+=f}p=h=null}function t(e){var t=e.naturalWidth,n=e.naturalHeight;if(t*n>1048576){var i=document.createElement("canvas");i.width=i.height=1;var r=i.getContext("2d");return r.drawImage(e,-t+1,0),0===r.getImageData(0,0,1,1).data[3]}return!1}function n(e,t,n){var i=document.createElement("canvas");i.width=1,i.height=n;var r=i.getContext("2d");r.drawImage(e,0,0);for(var o=r.getImageData(0,0,1,n).data,a=0,s=n,u=n;u>a;){var c=o[4*(u-1)+3];0===c?s=u:a=u,u=s+a>>1}i=null;var l=u/n;return 0===l?1:l}return{isSubsampled:t,renderTo:e}}),i(X,[D,u,p,m,w,G,q,l,d],function(e,t,n,i,r,o,a,s,u){function c(){function e(){if(!E&&!y)throw new n.ImageError(n.DOMException.INVALID_STATE_ERR);return E||y}function c(e){return i.atob(e.substring(e.indexOf("base64,")+7))}function l(e,t){return"data:"+(t||"")+";base64,"+i.btoa(e)}function d(e){var t=this;y=new Image,y.onerror=function(){g.call(this),t.trigger("error",new n.ImageError(n.ImageError.WRONG_FORMAT))},y.onload=function(){t.trigger("load")},y.src=/^data:[^;]*;base64,/.test(e)?e:l(e,x.type)}function f(e,t){var i=this,r;return window.FileReader?(r=new FileReader,r.onload=function(){t(this.result)},r.onerror=function(){i.trigger("error",new n.FileException(n.FileException.NOT_READABLE_ERR))},r.readAsDataURL(e),void 0):t(e.getAsDataURL())}function p(n,i,r,o){var a=this,s,u,c=0,l=0,d,f,p,g;if(b=o,g=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1,-1!==t.inArray(g,[5,6,7,8])){var v=n;n=i,i=v}return d=e(),u=r?Math.max:Math.min,s=u(n/d.width,i/d.height),s>1&&(!r||o)?(this.trigger("Resize"),void 0):(E||(E=document.createElement("canvas")),f=Math.round(d.width*s),p=Math.round(d.height*s),r?(E.width=n,E.height=i,f>n&&(c=Math.round((f-n)/2)),p>i&&(l=Math.round((p-i)/2))):(E.width=f,E.height=p),b||m(E.width,E.height,g),h.call(this,d,E,-c,-l,f,p),this.width=E.width,this.height=E.height,R=!0,a.trigger("Resize"),void 0)}function h(e,t,n,i,r,o){if("iOS"===u.OS)a.renderTo(e,t,{width:r,height:o,x:n,y:i});else{var s=t.getContext("2d");s.drawImage(e,n,i,r,o)}}function m(e,t,n){switch(n){case 5:case 6:case 7:case 8:E.width=t,E.height=e;break;default:E.width=e,E.height=t}var i=E.getContext("2d");switch(n){case 2:i.translate(e,0),i.scale(-1,1);break;case 3:i.translate(e,t),i.rotate(Math.PI);break;case 4:i.translate(0,t),i.scale(1,-1);break;case 5:i.rotate(.5*Math.PI),i.scale(1,-1);break;case 6:i.rotate(.5*Math.PI),i.translate(0,-t);break;case 7:i.rotate(.5*Math.PI),i.translate(e,-t),i.scale(-1,1);break;case 8:i.rotate(-.5*Math.PI),i.translate(-e,0)}}function g(){w&&(w.purge(),w=null),_=y=E=x=null,R=!1}var v=this,y,w,E,_,x,R=!1,b=!0;t.extend(this,{loadFromBlob:function(e){var t=this,i=t.getRuntime(),r=arguments.length>1?arguments[1]:!0;if(!i.can("access_binary"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);return x=e,e.isDetached()?(_=e.getSource(),d.call(this,_),void 0):(f.call(this,e.getSource(),function(e){r&&(_=c(e)),d.call(t,e)}),void 0)},loadFromImage:function(e,t){this.meta=e.meta,x=new r(null,{name:e.name,size:e.size,type:e.type}),d.call(this,t?_=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t=this.getRuntime(),n;return!w&&_&&t.can("access_image_binary")&&(w=new o(_)),n={width:e().width||0,height:e().height||0,type:x.type||s.getFileMime(x.name),size:_&&_.length||x.size||0,name:x.name||"",meta:w&&w.meta||this.meta||{}}},downsize:function(){p.apply(this,arguments)},getAsCanvas:function(){return E&&(E.id=this.uid+"_canvas"),E},getAsBlob:function(e,t){return e!==this.type&&p.call(this,this.width,this.height,!1),new r(null,{name:x.name||"",type:e,data:v.getAsBinaryString.call(this,e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!R)return y.src;if("image/jpeg"!==e)return E.toDataURL("image/png");try{return E.toDataURL("image/jpeg",t/100)}catch(n){return E.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!R)return _||(_=c(v.getAsDataURL(e,t))),_;if("image/jpeg"!==e)_=c(v.getAsDataURL(e,t));else{var n;t||(t=90);try{n=E.toDataURL("image/jpeg",t/100)}catch(i){n=E.toDataURL("image/jpeg")}_=c(n),w&&(_=w.stripHeaders(_),b&&(w.meta&&w.meta.exif&&w.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),_=w.writeHeaders(_)),w.purge(),w=null)}return R=!1,_},destroy:function(){v=null,g.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=c}),i(j,[u,d,f,p,g],function(e,t,n,i,r){function o(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(n){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function a(a){var c=this,l;a=e.extend({swf_url:t.swf_url},a),r.call(this,a,s,{access_binary:function(e){return e&&"browser"===c.mode},access_image_binary:function(e){return e&&"browser"===c.mode},display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===c.mode},resize_image:r.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===c.mode},return_status_code:function(t){return"browser"===c.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:function(e){return e&&"browser"===c.mode},send_browser_cookies:function(e){return e&&"browser"===c.mode},send_custom_headers:function(e){return e&&"browser"===c.mode},send_multipart:r.capTrue,slice_blob:r.capTrue,stream_upload:function(e){return e&&"browser"===c.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===c.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),o()<10&&(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid)},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec(this.uid,e,t,n)},init:function(){var n,r,o;o=this.getShimContainer(),e.extend(o.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),n=' '+' '+' '+' '+" ","IE"===t.browser?(r=document.createElement("div"),o.appendChild(r),r.outerHTML=n,r=o=null):o.innerHTML=n,l=setTimeout(function(){c&&!c.initialized&&c.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){e.call(c),clearTimeout(l),a=l=e=c=null}}(this.destroy)},u)}var s="flash",u={};return r.addConstructor(s,a),u}),i(V,[j,y],function(e,t){var n={slice:function(e,n,i,r){var o=this.getRuntime();return 0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),e=o.shimExec.call(this,"Blob","slice",n,i,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=n}),i(W,[j],function(e){var t={init:function(e){this.getRuntime().shimExec.call(this,"FileInput","init",{name:e.name,accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=t}),i(Y,[j,m],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i="",r={read:function(e,t){var r=this,o=r.getRuntime();return"readAsDataURL"===e&&(i="data:"+(t.type||"")+";base64,"),r.bind("Progress",function(t,r){r&&(i+=n(r,e))}),o.shimExec.call(this,"FileReader","readAsBase64",t.uid)},getResult:function(){return i},destroy:function(){i=null}};return e.FileReader=r}),i($,[j,m],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i={read:function(e,t){var i,r=this.getRuntime();return(i=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(i="data:"+(t.type||"")+";base64,"+i),n(i,e,t.type)):null}};return e.FileReaderSync=i}),i(J,[j,u,y,w,T,S,O],function(e,t,n,i,r,o,a){var s={send:function(e,i){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,i)}function s(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),i=null,r()}function u(e,t){var n=new a;n.bind("TransportingComplete",function(){t(this.result)}),n.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),i instanceof o){var d;if(i.each(function(e,t){e instanceof n?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),i.hasBlob()){var f=i.getBlob();f.isDetached()?u(f,function(e){f.destroy(),s(d,e)}):s(d,f)}else i=null,r()}else i instanceof n?i.isDetached()?u(i,function(e){i.destroy(),i=e.uid,r()}):(i=i.uid,r()):r()},getResponse:function(e){var n,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new i(a.uid,o),"blob"===e)return o;try{if(n=new r,~t.inArray(e,["","text"]))return n.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(n.readAsText(o))}finally{o.destroy()}}return null},abort:function(e){var t=this.getRuntime();t.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=s}),i(Z,[j,y],function(e,t){var n={getAsBlob:function(e){var n=this.getRuntime(),i=n.shimExec.call(this,"Transporter","getAsBlob",e);return i?new t(n.uid,i):null}};return e.Transporter=n}),i(K,[j,u,O,y,T],function(e,t,n,i,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(i,"Image","loadFromBlob",e.uid),i=r=null}var i=this,r=i.getRuntime();if(e.isDetached()){var o=new n;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getAsBlob:function(e,t){var n=this.getRuntime(),r=n.shimExec.call(this,"Image","getAsBlob",e,t);return r?new i(n.uid,r):null},getAsDataURL:function(){var e=this.getRuntime(),t=e.Image.getAsBlob.apply(this,arguments),n;return t?(n=new r,n.readAsDataURL(t)):null}};return e.Image=o}),i(Q,[u,d,f,p,g],function(e,t,n,i,r){function o(e){var t=!1,n=null,i,r,o,a,s,u=0;try{try{n=new ActiveXObject("AgControl.AgControl"),n.IsVersionSupported(e)&&(t=!0),n=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(i=l.description,"1.0.30226.2"===i&&(i="2.0.30226.2"),r=i.split(".");r.length>3;)r.pop();for(;r.length<4;)r.push(0);for(o=e.split(".");o.length>4;)o.pop();do a=parseInt(o[u],10),s=parseInt(r[u],10),u++;while(u=a&&!isNaN(a)&&(t=!0)}}}catch(d){t=!1}return t}function a(a){var c=this,l;a=e.extend({xap_url:t.xap_url},a),r.call(this,a,s,{access_binary:r.capTrue,access_image_binary:r.capTrue,display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:r.capTrue,resize_image:r.capTrue,return_response_headers:function(e){return e&&"client"===c.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===c.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:r.capTrue,send_browser_cookies:function(e){return e&&"browser"===c.mode},send_custom_headers:function(e){return e&&"client"===c.mode},send_multipart:r.capTrue,slice_blob:r.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:r.capTrue,use_http_method:function(t){return"client"===c.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),o("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid).content.Moxie},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec(this.uid,e,t,n)},init:function(){var e;e=this.getShimContainer(),e.innerHTML=''+' '+' '+' '+' '+' '+" ",l=setTimeout(function(){c&&!c.initialized&&c.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(c),clearTimeout(l),a=l=e=c=null}}(this.destroy)},u)}var s="silverlight",u={};return r.addConstructor(s,a),u}),i(et,[Q,u,V],function(e,t,n){return e.Blob=t.extend({},n)}),i(tt,[Q],function(e){var t={init:function(e){function t(e){for(var t="",n=0;no;o++)n=t.keys[o],s=t[n],s&&(/^(\d|[1-9]\d+)$/.test(s)?s=parseInt(s,10):/^\d*\.\d+$/.test(s)&&(s=parseFloat(s)),i.meta[e][n]=s)}),i.width=parseInt(r.width,10),i.height=parseInt(r.height,10),i.size=parseInt(r.size,10),i.type=r.type,i.name=r.name,i}})}),i(ut,[u,p,g,d],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue;n.call(this,t,o,{access_binary:s(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:s(a.Image&&(i.can("create_canvas")||i.can("use_data_uri_over32kb"))),do_cors:!1,drag_and_drop:!1,filter_by_extension:s(function(){return"Chrome"===i.browser&&i.version>=28||"IE"===i.browser&&i.version>=10}()),resize_image:function(){return a.Image&&r.can("access_binary")&&i.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return i.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return r.can("select_file")},summon_file_dialog:s(function(){return"Firefox"===i.browser&&i.version>=4||"Opera"===i.browser&&i.version>=12||!!~e.inArray(i.browser,["Chrome","Safari"])}()),upload_filesize:u,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html4",a={};return n.addConstructor(o,r),a}),i(ct,[ut,u,f,L,l,d],function(e,t,n,i,r,o){function a(){function e(){var r=this,l=r.getRuntime(),d,f,p,h,m,g;g=t.guid("uid_"),d=l.getShimContainer(),a&&(p=n.get(a+"_form"),p&&t.extend(p.style,{top:"100%"})),h=document.createElement("form"),h.setAttribute("id",g+"_form"),h.setAttribute("method","post"),h.setAttribute("enctype","multipart/form-data"),h.setAttribute("encoding","multipart/form-data"),t.extend(h.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=document.createElement("input"),m.setAttribute("id",g),m.setAttribute("type","file"),m.setAttribute("name",c.name||"Filedata"),m.setAttribute("accept",u.join(",")),t.extend(m.style,{fontSize:"999px",opacity:0}),h.appendChild(m),d.appendChild(h),t.extend(m.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===o.browser&&o.version<10&&t.extend(m.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),m.onchange=function(){var t;this.value&&(t=this.files?this.files[0]:{name:this.value},s=[t],this.onchange=function(){},e.call(r),r.bind("change",function i(){var e=n.get(g),t=n.get(g+"_form"),o;r.unbind("change",i),r.files.length&&e&&t&&(o=r.files[0],e.setAttribute("id",o.uid),t.setAttribute("id",o.uid+"_form"),t.setAttribute("target",o.uid+"_iframe")),e=t=null},998),m=h=null,r.trigger("change"))},l.can("summon_file_dialog")&&(f=n.get(c.browse_button),i.removeEvent(f,"click",r.uid),i.addEvent(f,"click",function(e){m&&!m.disabled&&m.click(),e.preventDefault()},r.uid)),a=g,d=p=f=null}var a,s=[],u=[],c;t.extend(this,{init:function(t){var o=this,a=o.getRuntime(),s;c=t,u=t.accept.mimes||r.extList2mimes(t.accept,a.can("filter_by_extension")),s=a.getShimContainer(),function(){var e,r,u;e=n.get(t.browse_button),a.can("summon_file_dialog")&&("static"===n.getStyle(e,"position")&&(e.style.position="relative"),r=parseInt(n.getStyle(e,"z-index"),10)||1,e.style.zIndex=r,s.style.zIndex=r-1),u=a.can("summon_file_dialog")?e:s,i.addEvent(u,"mouseover",function(){o.trigger("mouseenter")},o.uid),i.addEvent(u,"mouseout",function(){o.trigger("mouseleave")},o.uid),i.addEvent(u,"mousedown",function(){o.trigger("mousedown")},o.uid),i.addEvent(n.get(t.container),"mouseup",function(){o.trigger("mouseup")},o.uid),e=null}(),e.call(this),s=null,o.trigger({type:"ready",async:!0})},getFiles:function(){return s},disable:function(e){var t;(t=n.get(a))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),r=e.getShimContainer();i.removeAllEvents(r,this.uid),i.removeAllEvents(c&&n.get(c.container),this.uid),i.removeAllEvents(c&&n.get(c.browse_button),this.uid),r&&(r.innerHTML=""),t.removeInstance(this.uid),a=s=u=c=r=t=null}})}return e.FileInput=a}),i(lt,[ut,F],function(e,t){return e.FileReader=t}),i(dt,[ut,u,f,b,p,L,y,S],function(e,t,n,i,r,o,a,s){function u(){function e(e){var t=this,i,r,a,s,u=!1;if(l){if(i=l.id.replace(/_iframe$/,""),r=n.get(i+"_form")){for(a=r.getElementsByTagName("input"),s=a.length;s--;)switch(a[s].getAttribute("type")){case"hidden":a[s].parentNode.removeChild(a[s]);break;case"file":u=!0}a=[],u||r.parentNode.removeChild(r),r=null}setTimeout(function(){o.removeEvent(l,"load",t.uid),l.parentNode&&l.parentNode.removeChild(l);var n=t.getRuntime().getShimContainer();n.children.length||n.parentNode.removeChild(n),n=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,f){function p(){var n=m.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='',l=r.firstChild,n.appendChild(l),o.addEvent(l,"load",function(){var n;try{n=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(n.title)?u=n.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(n.body.innerHTML),h.trigger({type:"progress",loaded:c.length,total:c.length}),w&&h.trigger({type:"uploadprogress",loaded:w.size||1025,total:w.size||1025}))}catch(r){if(!i.hasSameOrigin(d.url))return e.call(h,function(){h.trigger("error")}),void 0;u=404}e.call(h,function(){h.trigger("load")})},h.uid)}var h=this,m=h.getRuntime(),g,v,y,w;if(u=c=null,f instanceof s&&f.hasBlob()){if(w=f.getBlob(),g=w.uid,y=n.get(g),v=n.get(g+"_form"),!v)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else g=t.guid("uid_"),v=document.createElement("form"),v.setAttribute("id",g+"_form"),v.setAttribute("method",d.method),v.setAttribute("enctype","multipart/form-data"),v.setAttribute("encoding","multipart/form-data"),v.setAttribute("target",g+"_iframe"),m.getShimContainer().appendChild(v);f instanceof s&&f.each(function(e,n){if(e instanceof a)y&&y.setAttribute("name",n);else{var i=document.createElement("input");t.extend(i,{type:"hidden",name:n,value:e}),y?v.insertBefore(i,y):v.appendChild(i)}}),v.setAttribute("action",d.url),p(),v.submit(),h.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*]*>/,"").replace(/<\/pre>\s*$/,""))}catch(n){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})}})}return e.XMLHttpRequest=u}),i(ft,[ut,X],function(e,t){return e.Image=t}),a([u,c,l,d,f,p,h,m,g,v,y,w,E,_,x,R,b,T,S,A,O,I,L])}(this);;(function(){"use strict";var e={},t=moxie.core.utils.Basic.inArray;return function n(r){var i,s;for(i in r)s=typeof r[i],s==="object"&&!~t(i,["Exceptions","Env","Mime"])?n(r[i]):s==="function"&&(e[i]=r[i])}(window.moxie),e.Env=window.moxie.core.utils.Env,e.Mime=window.moxie.core.utils.Mime,e.Exceptions=window.moxie.core.Exceptions,window.mOxie=e,window.o||(window.o=e),e})();
\ No newline at end of file
diff --git a/demo/js/plupload/plupload.dev.js b/demo/js/plupload/plupload.dev.js
deleted file mode 100644
index 95319896..00000000
--- a/demo/js/plupload/plupload.dev.js
+++ /dev/null
@@ -1,2273 +0,0 @@
-/**
- * Plupload - multi-runtime File Uploader
- * v2.1.1
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-/**
- * Plupload.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global mOxie:true */
-
-;(function(window, o, undef) {
-
-var delay = window.setTimeout
-, fileFilters = {}
-;
-
-// convert plupload features to caps acceptable by mOxie
-function normalizeCaps(settings) {
- var features = settings.required_features, caps = {};
-
- function resolve(feature, value, strict) {
- // Feature notation is deprecated, use caps (this thing here is required for backward compatibility)
- var map = {
- chunks: 'slice_blob',
- jpgresize: 'send_binary_string',
- pngresize: 'send_binary_string',
- progress: 'report_upload_progress',
- multi_selection: 'select_multiple',
- dragdrop: 'drag_and_drop',
- drop_element: 'drag_and_drop',
- headers: 'send_custom_headers',
- canSendBinary: 'send_binary',
- triggerDialog: 'summon_file_dialog'
- };
-
- if (map[feature]) {
- caps[map[feature]] = value;
- } else if (!strict) {
- caps[feature] = value;
- }
- }
-
- if (typeof(features) === 'string') {
- plupload.each(features.split(/\s*,\s*/), function(feature) {
- resolve(feature, true);
- });
- } else if (typeof(features) === 'object') {
- plupload.each(features, function(value, feature) {
- resolve(feature, value);
- });
- } else if (features === true) {
- // check settings for required features
- if (!settings.multipart) { // special care for multipart: false
- caps.send_binary_string = true;
- }
-
- if (settings.chunk_size > 0) {
- caps.slice_blob = true;
- }
-
- if (settings.resize.enabled) {
- caps.send_binary_string = true;
- }
-
- plupload.each(settings, function(value, feature) {
- resolve(feature, !!value, true); // strict check
- });
- }
-
- return caps;
-}
-
-/**
- * @module plupload
- * @static
- */
-var plupload = {
- /**
- * Plupload version will be replaced on build.
- *
- * @property VERSION
- * @for Plupload
- * @static
- * @final
- */
- VERSION : '2.1.1',
-
- /**
- * Inital state of the queue and also the state ones it's finished all it's uploads.
- *
- * @property STOPPED
- * @static
- * @final
- */
- STOPPED : 1,
-
- /**
- * Upload process is running
- *
- * @property STARTED
- * @static
- * @final
- */
- STARTED : 2,
-
- /**
- * File is queued for upload
- *
- * @property QUEUED
- * @static
- * @final
- */
- QUEUED : 1,
-
- /**
- * File is being uploaded
- *
- * @property UPLOADING
- * @static
- * @final
- */
- UPLOADING : 2,
-
- /**
- * File has failed to be uploaded
- *
- * @property FAILED
- * @static
- * @final
- */
- FAILED : 4,
-
- /**
- * File has been uploaded successfully
- *
- * @property DONE
- * @static
- * @final
- */
- DONE : 5,
-
- // Error constants used by the Error event
-
- /**
- * Generic error for example if an exception is thrown inside Silverlight.
- *
- * @property GENERIC_ERROR
- * @static
- * @final
- */
- GENERIC_ERROR : -100,
-
- /**
- * HTTP transport error. For example if the server produces a HTTP status other than 200.
- *
- * @property HTTP_ERROR
- * @static
- * @final
- */
- HTTP_ERROR : -200,
-
- /**
- * Generic I/O error. For exampe if it wasn't possible to open the file stream on local machine.
- *
- * @property IO_ERROR
- * @static
- * @final
- */
- IO_ERROR : -300,
-
- /**
- * Generic I/O error. For exampe if it wasn't possible to open the file stream on local machine.
- *
- * @property SECURITY_ERROR
- * @static
- * @final
- */
- SECURITY_ERROR : -400,
-
- /**
- * Initialization error. Will be triggered if no runtime was initialized.
- *
- * @property INIT_ERROR
- * @static
- * @final
- */
- INIT_ERROR : -500,
-
- /**
- * File size error. If the user selects a file that is too large it will be blocked and an error of this type will be triggered.
- *
- * @property FILE_SIZE_ERROR
- * @static
- * @final
- */
- FILE_SIZE_ERROR : -600,
-
- /**
- * File extension error. If the user selects a file that isn't valid according to the filters setting.
- *
- * @property FILE_EXTENSION_ERROR
- * @static
- * @final
- */
- FILE_EXTENSION_ERROR : -601,
-
- /**
- * Duplicate file error. If prevent_duplicates is set to true and user selects the same file again.
- *
- * @property FILE_DUPLICATE_ERROR
- * @static
- * @final
- */
- FILE_DUPLICATE_ERROR : -602,
-
- /**
- * Runtime will try to detect if image is proper one. Otherwise will throw this error.
- *
- * @property IMAGE_FORMAT_ERROR
- * @static
- * @final
- */
- IMAGE_FORMAT_ERROR : -700,
-
- /**
- * While working on the image runtime will try to detect if the operation may potentially run out of memeory and will throw this error.
- *
- * @property IMAGE_MEMORY_ERROR
- * @static
- * @final
- */
- IMAGE_MEMORY_ERROR : -701,
-
- /**
- * Each runtime has an upper limit on a dimension of the image it can handle. If bigger, will throw this error.
- *
- * @property IMAGE_DIMENSIONS_ERROR
- * @static
- * @final
- */
- IMAGE_DIMENSIONS_ERROR : -702,
-
- /**
- * Mime type lookup table.
- *
- * @property mimeTypes
- * @type Object
- * @final
- */
- mimeTypes : o.mimes,
-
- /**
- * In some cases sniffing is the only way around :(
- */
- ua: o.ua,
-
- /**
- * Gets the true type of the built-in object (better version of typeof).
- * @credits Angus Croll (http://javascriptweblog.wordpress.com/)
- *
- * @method typeOf
- * @static
- * @param {Object} o Object to check.
- * @return {String} Object [[Class]]
- */
- typeOf: o.typeOf,
-
- /**
- * Extends the specified object with another object.
- *
- * @method extend
- * @static
- * @param {Object} target Object to extend.
- * @param {Object..} obj Multiple objects to extend with.
- * @return {Object} Same as target, the extended object.
- */
- extend : o.extend,
-
- /**
- * Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers.
- * The only way a user would be able to get the same ID is if the two persons at the same exact milisecond manages
- * to get 5 the same random numbers between 0-65535 it also uses a counter so each call will be guaranteed to be page unique.
- * It's more probable for the earth to be hit with an ansteriod. You can also if you want to be 100% sure set the plupload.guidPrefix property
- * to an user unique key.
- *
- * @method guid
- * @static
- * @return {String} Virtually unique id.
- */
- guid : o.guid,
-
- /**
- * Get array of DOM Elements by their ids.
- *
- * @method get
- * @for Utils
- * @param {String} id Identifier of the DOM Element
- * @return {Array}
- */
- get : function get(ids) {
- var els = [], el;
-
- if (o.typeOf(ids) !== 'array') {
- ids = [ids];
- }
-
- var i = ids.length;
- while (i--) {
- el = o.get(ids[i]);
- if (el) {
- els.push(el);
- }
- }
-
- return els.length ? els : null;
- },
-
- /**
- * Executes the callback function for each item in array/object. If you return false in the
- * callback it will break the loop.
- *
- * @method each
- * @static
- * @param {Object} obj Object to iterate.
- * @param {function} callback Callback function to execute for each item.
- */
- each : o.each,
-
- /**
- * Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
- *
- * @method getPos
- * @static
- * @param {Element} node HTML element or element id to get x, y position from.
- * @param {Element} root Optional root element to stop calculations at.
- * @return {object} Absolute position of the specified element object with x, y fields.
- */
- getPos : o.getPos,
-
- /**
- * Returns the size of the specified node in pixels.
- *
- * @method getSize
- * @static
- * @param {Node} node Node to get the size of.
- * @return {Object} Object with a w and h property.
- */
- getSize : o.getSize,
-
- /**
- * Encodes the specified string.
- *
- * @method xmlEncode
- * @static
- * @param {String} s String to encode.
- * @return {String} Encoded string.
- */
- xmlEncode : function(str) {
- var xmlEncodeChars = {'<' : 'lt', '>' : 'gt', '&' : 'amp', '"' : 'quot', '\'' : '#39'}, xmlEncodeRegExp = /[<>&\"\']/g;
-
- return str ? ('' + str).replace(xmlEncodeRegExp, function(chr) {
- return xmlEncodeChars[chr] ? '&' + xmlEncodeChars[chr] + ';' : chr;
- }) : str;
- },
-
- /**
- * Forces anything into an array.
- *
- * @method toArray
- * @static
- * @param {Object} obj Object with length field.
- * @return {Array} Array object containing all items.
- */
- toArray : o.toArray,
-
- /**
- * Find an element in array and return it's index if present, otherwise return -1.
- *
- * @method inArray
- * @static
- * @param {mixed} needle Element to find
- * @param {Array} array
- * @return {Int} Index of the element, or -1 if not found
- */
- inArray : o.inArray,
-
- /**
- * Extends the language pack object with new items.
- *
- * @method addI18n
- * @static
- * @param {Object} pack Language pack items to add.
- * @return {Object} Extended language pack object.
- */
- addI18n : o.addI18n,
-
- /**
- * Translates the specified string by checking for the english string in the language pack lookup.
- *
- * @method translate
- * @static
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- translate : o.translate,
-
- /**
- * Checks if object is empty.
- *
- * @method isEmptyObj
- * @static
- * @param {Object} obj Object to check.
- * @return {Boolean}
- */
- isEmptyObj : o.isEmptyObj,
-
- /**
- * Checks if specified DOM element has specified class.
- *
- * @method hasClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- hasClass : o.hasClass,
-
- /**
- * Adds specified className to specified DOM element.
- *
- * @method addClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- addClass : o.addClass,
-
- /**
- * Removes specified className from specified DOM element.
- *
- * @method removeClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- removeClass : o.removeClass,
-
- /**
- * Returns a given computed style of a DOM element.
- *
- * @method getStyle
- * @static
- * @param {Object} obj DOM element like object.
- * @param {String} name Style you want to get from the DOM element
- */
- getStyle : o.getStyle,
-
- /**
- * Adds an event handler to the specified object and store reference to the handler
- * in objects internal Plupload registry (@see removeEvent).
- *
- * @method addEvent
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Name to add event listener to.
- * @param {Function} callback Function to call when event occurs.
- * @param {String} (optional) key that might be used to add specifity to the event record.
- */
- addEvent : o.addEvent,
-
- /**
- * Remove event handler from the specified object. If third argument (callback)
- * is not specified remove all events with the specified name.
- *
- * @method removeEvent
- * @static
- * @param {Object} obj DOM element to remove event listener(s) from.
- * @param {String} name Name of event listener to remove.
- * @param {Function|String} (optional) might be a callback or unique key to match.
- */
- removeEvent: o.removeEvent,
-
- /**
- * Remove all kind of events from the specified object
- *
- * @method removeAllEvents
- * @static
- * @param {Object} obj DOM element to remove event listeners from.
- * @param {String} (optional) unique key to match, when removing events.
- */
- removeAllEvents: o.removeAllEvents,
-
- /**
- * Cleans the specified name from national characters (diacritics). The result will be a name with only a-z, 0-9 and _.
- *
- * @method cleanName
- * @static
- * @param {String} s String to clean up.
- * @return {String} Cleaned string.
- */
- cleanName : function(name) {
- var i, lookup;
-
- // Replace diacritics
- lookup = [
- /[\300-\306]/g, 'A', /[\340-\346]/g, 'a',
- /\307/g, 'C', /\347/g, 'c',
- /[\310-\313]/g, 'E', /[\350-\353]/g, 'e',
- /[\314-\317]/g, 'I', /[\354-\357]/g, 'i',
- /\321/g, 'N', /\361/g, 'n',
- /[\322-\330]/g, 'O', /[\362-\370]/g, 'o',
- /[\331-\334]/g, 'U', /[\371-\374]/g, 'u'
- ];
-
- for (i = 0; i < lookup.length; i += 2) {
- name = name.replace(lookup[i], lookup[i + 1]);
- }
-
- // Replace whitespace
- name = name.replace(/\s+/g, '_');
-
- // Remove anything else
- name = name.replace(/[^a-z0-9_\-\.]+/gi, '');
-
- return name;
- },
-
- /**
- * Builds a full url out of a base URL and an object with items to append as query string items.
- *
- * @method buildUrl
- * @static
- * @param {String} url Base URL to append query string items to.
- * @param {Object} items Name/value object to serialize as a querystring.
- * @return {String} String with url + serialized query string items.
- */
- buildUrl : function(url, items) {
- var query = '';
-
- plupload.each(items, function(value, name) {
- query += (query ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
- });
-
- if (query) {
- url += (url.indexOf('?') > 0 ? '&' : '?') + query;
- }
-
- return url;
- },
-
- /**
- * Formats the specified number as a size string for example 1024 becomes 1 KB.
- *
- * @method formatSize
- * @static
- * @param {Number} size Size to format as string.
- * @return {String} Formatted size string.
- */
- formatSize : function(size) {
-
- if (size === undef || /\D/.test(size)) {
- return plupload.translate('N/A');
- }
-
- function round(num, precision) {
- return Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision);
- }
-
- var boundary = Math.pow(1024, 4);
-
- // TB
- if (size > boundary) {
- return round(size / boundary, 1) + " " + plupload.translate('tb');
- }
-
- // GB
- if (size > (boundary/=1024)) {
- return round(size / boundary, 1) + " " + plupload.translate('gb');
- }
-
- // MB
- if (size > (boundary/=1024)) {
- return round(size / boundary, 1) + " " + plupload.translate('mb');
- }
-
- // KB
- if (size > 1024) {
- return Math.round(size / 1024) + " " + plupload.translate('kb');
- }
-
- return size + " " + plupload.translate('b');
- },
-
-
- /**
- * Parses the specified size string into a byte value. For example 10kb becomes 10240.
- *
- * @method parseSize
- * @static
- * @param {String|Number} size String to parse or number to just pass through.
- * @return {Number} Size in bytes.
- */
- parseSize : o.parseSizeStr,
-
-
- /**
- * A way to predict what runtime will be choosen in the current environment with the
- * specified settings.
- *
- * @method predictRuntime
- * @static
- * @param {Object|String} config Plupload settings to check
- * @param {String} [runtimes] Comma-separated list of runtimes to check against
- * @return {String} Type of compatible runtime
- */
- predictRuntime : function(config, runtimes) {
- var up, runtime;
-
- up = new plupload.Uploader(config);
- runtime = o.Runtime.thatCan(up.getOption().required_features, runtimes || config.runtimes);
- up.destroy();
- return runtime;
- },
-
- /**
- * Registers a filter that will be executed for each file added to the queue.
- * If callback returns false, file will not be added.
- *
- * Callback receives two arguments: a value for the filter as it was specified in settings.filters
- * and a file to be filtered. Callback is executed in the context of uploader instance.
- *
- * @method addFileFilter
- * @static
- * @param {String} name Name of the filter by which it can be referenced in settings.filters
- * @param {String} cb Callback - the actual routine that every added file must pass
- */
- addFileFilter: function(name, cb) {
- fileFilters[name] = cb;
- }
-};
-
-
-plupload.addFileFilter('mime_types', function(filters, file, cb) {
- if (filters.length && !filters.regexp.test(file.name)) {
- this.trigger('Error', {
- code : plupload.FILE_EXTENSION_ERROR,
- message : plupload.translate('File extension error.'),
- file : file
- });
- cb(false);
- } else {
- cb(true);
- }
-});
-
-
-plupload.addFileFilter('max_file_size', function(maxSize, file, cb) {
- var undef;
-
- maxSize = plupload.parseSize(maxSize);
-
- // Invalid file size
- if (file.size !== undef && maxSize && file.size > maxSize) {
- this.trigger('Error', {
- code : plupload.FILE_SIZE_ERROR,
- message : plupload.translate('File size error.'),
- file : file
- });
- cb(false);
- } else {
- cb(true);
- }
-});
-
-
-plupload.addFileFilter('prevent_duplicates', function(value, file, cb) {
- if (value) {
- var ii = this.files.length;
- while (ii--) {
- // Compare by name and size (size might be 0 or undefined, but still equivalent for both)
- if (file.name === this.files[ii].name && file.size === this.files[ii].size) {
- this.trigger('Error', {
- code : plupload.FILE_DUPLICATE_ERROR,
- message : plupload.translate('Duplicate file error.'),
- file : file
- });
- cb(false);
- return;
- }
- }
- }
- cb(true);
-});
-
-
-/**
-@class Uploader
-@constructor
-
-@param {Object} settings For detailed information about each option check documentation.
- @param {String|DOMElement} settings.browse_button id of the DOM element or DOM element itself to use as file dialog trigger.
- @param {String} settings.url URL of the server-side upload handler.
- @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
- @param {String} [settings.container] id of the DOM element to use as a container for uploader structures. Defaults to document.body.
- @param {String|DOMElement} [settings.drop_element] id of the DOM element or DOM element itself to use as a drop zone for Drag-n-Drop.
- @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
- @param {Object} [settings.filters={}] Set of file type filters.
- @param {Array} [settings.filters.mime_types=[]] List of file types to accept, each one defined by title and list of extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
- @param {String|Number} [settings.filters.max_file_size=0] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
- @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
- @param {String} [settings.flash_swf_url] URL of the Flash swf.
- @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
- @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
- @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
- @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
- @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
- @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
- @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
- @param {Number} [settings.resize.width] If image is bigger, it will be resized.
- @param {Number} [settings.resize.height] If image is bigger, it will be resized.
- @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
- @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
- @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
- @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
- @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
-*/
-plupload.Uploader = function(options) {
- /**
- * Fires when the current RunTime has been initialized.
- *
- * @event Init
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- * Fires after the init event incase you need to perform actions there.
- *
- * @event PostInit
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- * Fires when the option is changed in via uploader.setOption().
- *
- * @event OptionChanged
- * @since 2.1
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {String} name Name of the option that was changed
- * @param {Mixed} value New value for the specified option
- * @param {Mixed} oldValue Previous value of the option
- */
-
- /**
- * Fires when the silverlight/flash or other shim needs to move.
- *
- * @event Refresh
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- * Fires when the overall state is being changed for the upload queue.
- *
- * @event StateChanged
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- * Fires when a file is to be uploaded by the runtime.
- *
- * @event UploadFile
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file File to be uploaded.
- */
-
- /**
- * Fires when just before a file is uploaded. This event enables you to override settings
- * on the uploader instance before the file is uploaded.
- *
- * @event BeforeUpload
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file File to be uploaded.
- */
-
- /**
- * Fires when the file queue is changed. In other words when files are added/removed to the files array of the uploader instance.
- *
- * @event QueueChanged
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- * Fires while a file is being uploaded. Use this event to update the current file upload progress.
- *
- * @event UploadProgress
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file File that is currently being uploaded.
- */
-
- /**
- * Fires when file is removed from the queue.
- *
- * @event FilesRemoved
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {Array} files Array of files that got removed.
- */
-
- /**
- * Fires for every filtered file before it is added to the queue.
- *
- * @event FileFiltered
- * @since 2.1
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file Another file that has to be added to the queue.
- */
-
- /**
- * Fires after files were filtered and added to the queue.
- *
- * @event FilesAdded
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {Array} files Array of file objects that were added to queue by the user.
- */
-
- /**
- * Fires when a file is successfully uploaded.
- *
- * @event FileUploaded
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file File that was uploaded.
- * @param {Object} response Object with response properties.
- */
-
- /**
- * Fires when file chunk is uploaded.
- *
- * @event ChunkUploaded
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {plupload.File} file File that the chunk was uploaded for.
- * @param {Object} response Object with response properties.
- */
-
- /**
- * Fires when all files in a queue are uploaded.
- *
- * @event UploadComplete
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {Array} files Array of file objects that was added to queue/selected by the user.
- */
-
- /**
- * Fires when a error occurs.
- *
- * @event Error
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- * @param {Object} error Contains code, message and sometimes file and other details.
- */
-
- /**
- * Fires when destroy method is called.
- *
- * @event Destroy
- * @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
- var uid = plupload.guid()
- , settings
- , files = []
- , preferred_caps = {}
- , fileInputs = []
- , fileDrops = []
- , startTime
- , total
- , disabled = false
- , xhr
- ;
-
-
- // Private methods
- function uploadNext() {
- var file, count = 0, i;
-
- if (this.state == plupload.STARTED) {
- // Find first QUEUED file
- for (i = 0; i < files.length; i++) {
- if (!file && files[i].status == plupload.QUEUED) {
- file = files[i];
- if (this.trigger("BeforeUpload", file)) {
- file.status = plupload.UPLOADING;
- this.trigger("UploadFile", file);
- }
- } else {
- count++;
- }
- }
-
- // All files are DONE or FAILED
- if (count == files.length) {
- if (this.state !== plupload.STOPPED) {
- this.state = plupload.STOPPED;
- this.trigger("StateChanged");
- }
- this.trigger("UploadComplete", files);
- }
- }
- }
-
-
- function calcFile(file) {
- file.percent = file.size > 0 ? Math.ceil(file.loaded / file.size * 100) : 100;
- calc();
- }
-
-
- function calc() {
- var i, file;
-
- // Reset stats
- total.reset();
-
- // Check status, size, loaded etc on all files
- for (i = 0; i < files.length; i++) {
- file = files[i];
-
- if (file.size !== undef) {
- // We calculate totals based on original file size
- total.size += file.origSize;
-
- // Since we cannot predict file size after resize, we do opposite and
- // interpolate loaded amount to match magnitude of total
- total.loaded += file.loaded * file.origSize / file.size;
- } else {
- total.size = undef;
- }
-
- if (file.status == plupload.DONE) {
- total.uploaded++;
- } else if (file.status == plupload.FAILED) {
- total.failed++;
- } else {
- total.queued++;
- }
- }
-
- // If we couldn't calculate a total file size then use the number of files to calc percent
- if (total.size === undef) {
- total.percent = files.length > 0 ? Math.ceil(total.uploaded / files.length * 100) : 0;
- } else {
- total.bytesPerSec = Math.ceil(total.loaded / ((+new Date() - startTime || 1) / 1000.0));
- total.percent = total.size > 0 ? Math.ceil(total.loaded / total.size * 100) : 0;
- }
- }
-
-
- function getRUID() {
- var ctrl = fileInputs[0] || fileDrops[0];
- if (ctrl) {
- return ctrl.getRuntime().uid;
- }
- return false;
- }
-
-
- function runtimeCan(file, cap) {
- if (file.ruid) {
- var info = o.Runtime.getInfo(file.ruid);
- if (info) {
- return info.can(cap);
- }
- }
- return false;
- }
-
-
- function bindEventListeners() {
- this.bind('FilesAdded', onFilesAdded);
-
- this.bind('CancelUpload', onCancelUpload);
-
- this.bind('BeforeUpload', onBeforeUpload);
-
- this.bind('UploadFile', onUploadFile);
-
- this.bind('UploadProgress', onUploadProgress);
-
- this.bind('StateChanged', onStateChanged);
-
- this.bind('QueueChanged', calc);
-
- this.bind('Error', onError);
-
- this.bind('FileUploaded', onFileUploaded);
-
- this.bind('Destroy', onDestroy);
- }
-
-
- function initControls(settings, cb) {
- var self = this, inited = 0, queue = [];
-
- // common settings
- var options = {
- accept: settings.filters.mime_types,
- runtime_order: settings.runtimes,
- required_caps: settings.required_features,
- preferred_caps: preferred_caps,
- swf_url: settings.flash_swf_url,
- xap_url: settings.silverlight_xap_url
- };
-
- // add runtime specific options if any
- plupload.each(settings.runtimes.split(/\s*,\s*/), function(runtime) {
- if (settings[runtime]) {
- options[runtime] = settings[runtime];
- }
- });
-
- // initialize file pickers - there can be many
- if (settings.browse_button) {
- plupload.each(settings.browse_button, function(el) {
- queue.push(function(cb) {
- var fileInput = new o.FileInput(plupload.extend({}, options, {
- name: settings.file_data_name,
- multiple: settings.multi_selection,
- container: settings.container,
- browse_button: el
- }));
-
- fileInput.onready = function() {
- var info = o.Runtime.getInfo(this.ruid);
-
- // for backward compatibility
- o.extend(self.features, {
- chunks: info.can('slice_blob'),
- multipart: info.can('send_multipart'),
- multi_selection: info.can('select_multiple')
- });
-
- inited++;
- fileInputs.push(this);
- cb();
- };
-
- fileInput.onchange = function() {
- self.addFile(this.files);
- };
-
- fileInput.bind('mouseenter mouseleave mousedown mouseup', function(e) {
- if (!disabled) {
- if (settings.browse_button_hover) {
- if ('mouseenter' === e.type) {
- o.addClass(el, settings.browse_button_hover);
- } else if ('mouseleave' === e.type) {
- o.removeClass(el, settings.browse_button_hover);
- }
- }
-
- if (settings.browse_button_active) {
- if ('mousedown' === e.type) {
- o.addClass(el, settings.browse_button_active);
- } else if ('mouseup' === e.type) {
- o.removeClass(el, settings.browse_button_active);
- }
- }
- }
- });
-
- fileInput.bind('error runtimeerror', function() {
- fileInput = null;
- cb();
- });
-
- fileInput.init();
- });
- });
- }
-
- // initialize drop zones
- if (settings.drop_element) {
- plupload.each(settings.drop_element, function(el) {
- queue.push(function(cb) {
- var fileDrop = new o.FileDrop(plupload.extend({}, options, {
- drop_zone: el
- }));
-
- fileDrop.onready = function() {
- var info = o.Runtime.getInfo(this.ruid);
-
- self.features.dragdrop = info.can('drag_and_drop'); // for backward compatibility
-
- inited++;
- fileDrops.push(this);
- cb();
- };
-
- fileDrop.ondrop = function() {
- self.addFile(this.files);
- };
-
- fileDrop.bind('error runtimeerror', function() {
- fileDrop = null;
- cb();
- });
-
- fileDrop.init();
- });
- });
- }
-
-
- o.inSeries(queue, function() {
- if (typeof(cb) === 'function') {
- cb(inited);
- }
- });
- }
-
-
- function resizeImage(blob, params, cb) {
- var img = new o.Image();
-
- try {
- img.onload = function() {
- img.downsize(params.width, params.height, params.crop, params.preserve_headers);
- };
-
- img.onresize = function() {
- cb(this.getAsBlob(blob.type, params.quality));
- this.destroy();
- };
-
- img.onerror = function() {
- cb(blob);
- };
-
- img.load(blob);
- } catch(ex) {
- cb(blob);
- }
- }
-
-
- function setOption(option, value, init) {
- var self = this, reinitRequired = false;
-
- function _setOption(option, value, init) {
- var oldValue = settings[option];
-
- switch (option) {
- case 'max_file_size':
- if (option === 'max_file_size') {
- settings.max_file_size = settings.filters.max_file_size = value;
- }
- break;
-
- case 'chunk_size':
- if (value = plupload.parseSize(value)) {
- settings[option] = value;
- }
- break;
-
- case 'filters':
- // for sake of backward compatibility
- if (plupload.typeOf(value) === 'array') {
- value = {
- mime_types: value
- };
- }
-
- if (init) {
- plupload.extend(settings.filters, value);
- } else {
- settings.filters = value;
- }
-
- // if file format filters are being updated, regenerate the matching expressions
- if (value.mime_types) {
- settings.filters.mime_types.regexp = (function(filters) {
- var extensionsRegExp = [];
-
- plupload.each(filters, function(filter) {
- plupload.each(filter.extensions.split(/,/), function(ext) {
- if (/^\s*\*\s*$/.test(ext)) {
- extensionsRegExp.push('\\.*');
- } else {
- extensionsRegExp.push('\\.' + ext.replace(new RegExp('[' + ('/^$.*+?|()[]{}\\'.replace(/./g, '\\$&')) + ']', 'g'), '\\$&'));
- }
- });
- });
-
- return new RegExp('(' + extensionsRegExp.join('|') + ')$', 'i');
- }(settings.filters.mime_types));
- }
- break;
-
- case 'resize':
- if (init) {
- plupload.extend(settings.resize, value, {
- enabled: true
- });
- } else {
- settings.resize = value;
- }
- break;
-
- case 'prevent_duplicates':
- settings.prevent_duplicates = settings.filters.prevent_duplicates = !!value;
- break;
-
- case 'browse_button':
- case 'drop_element':
- value = plupload.get(value);
-
- case 'container':
- case 'runtimes':
- case 'multi_selection':
- case 'flash_swf_url':
- case 'silverlight_xap_url':
- settings[option] = value;
- if (!init) {
- reinitRequired = true;
- }
- break;
-
- default:
- settings[option] = value;
- }
-
- if (!init) {
- self.trigger('OptionChanged', option, value, oldValue);
- }
- }
-
- if (typeof(option) === 'object') {
- plupload.each(option, function(value, option) {
- _setOption(option, value, init);
- });
- } else {
- _setOption(option, value, init);
- }
-
- if (init) {
- // Normalize the list of required capabilities
- settings.required_features = normalizeCaps(plupload.extend({}, settings));
-
- // Come up with the list of capabilities that can affect default mode in a multi-mode runtimes
- preferred_caps = normalizeCaps(plupload.extend({}, settings, {
- required_features: true
- }));
- } else if (reinitRequired) {
- self.trigger('Destroy');
-
- initControls.call(self, settings, function(inited) {
- if (inited) {
- self.runtime = o.Runtime.getInfo(getRUID()).type;
- self.trigger('Init', { runtime: self.runtime });
- self.trigger('PostInit');
- } else {
- self.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate('Init error.')
- });
- }
- });
- }
- }
-
-
- // Internal event handlers
- function onFilesAdded(up, filteredFiles) {
- // Add files to queue
- [].push.apply(files, filteredFiles);
-
- up.trigger('QueueChanged');
- up.refresh();
- }
-
-
- function onBeforeUpload(up, file) {
- // Generate unique target filenames
- if (settings.unique_names) {
- var matches = file.name.match(/\.([^.]+)$/), ext = "part";
- if (matches) {
- ext = matches[1];
- }
- file.target_name = file.id + '.' + ext;
- }
- }
-
-
- function onUploadFile(up, file) {
- var url = up.settings.url
- , chunkSize = up.settings.chunk_size
- , retries = up.settings.max_retries
- , features = up.features
- , offset = 0
- , blob
- ;
-
- // make sure we start at a predictable offset
- if (file.loaded) {
- offset = file.loaded = chunkSize * Math.floor(file.loaded / chunkSize);
- }
-
- function handleError() {
- if (retries-- > 0) {
- delay(uploadNextChunk, 1000);
- } else {
- file.loaded = offset; // reset all progress
-
- up.trigger('Error', {
- code : plupload.HTTP_ERROR,
- message : plupload.translate('HTTP Error.'),
- file : file,
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
- }
- }
-
- function uploadNextChunk() {
- var chunkBlob, formData, args, curChunkSize;
-
- // File upload finished
- if (file.status == plupload.DONE || file.status == plupload.FAILED || up.state == plupload.STOPPED) {
- return;
- }
-
- // Standard arguments
- args = {name : file.target_name || file.name};
-
- if (chunkSize && features.chunks && blob.size > chunkSize) { // blob will be of type string if it was loaded in memory
- curChunkSize = Math.min(chunkSize, blob.size - offset);
- chunkBlob = blob.slice(offset, offset + curChunkSize);
- } else {
- curChunkSize = blob.size;
- chunkBlob = blob;
- }
-
- // If chunking is enabled add corresponding args, no matter if file is bigger than chunk or smaller
- if (chunkSize && features.chunks) {
- // Setup query string arguments
- if (up.settings.send_chunk_number) {
- args.chunk = Math.ceil(offset / chunkSize);
- args.chunks = Math.ceil(blob.size / chunkSize);
- } else { // keep support for experimental chunk format, just in case
- args.offset = offset;
- args.total = blob.size;
- }
- }
-
- xhr = new o.XMLHttpRequest();
-
- // Do we have upload progress support
- if (xhr.upload) {
- xhr.upload.onprogress = function(e) {
- file.loaded = Math.min(file.size, offset + e.loaded);
- up.trigger('UploadProgress', file);
- };
- }
-
- xhr.onload = function() {
- // check if upload made itself through
- if (xhr.status >= 400) {
- handleError();
- return;
- }
-
- retries = up.settings.max_retries; // reset the counter
-
- // Handle chunk response
- if (curChunkSize < blob.size) {
- chunkBlob.destroy();
-
- offset += curChunkSize;
- file.loaded = Math.min(offset, blob.size);
-
- up.trigger('ChunkUploaded', file, {
- offset : file.loaded,
- total : blob.size,
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
-
- // stock Android browser doesn't fire upload progress events, but in chunking mode we can fake them
- if (o.Env.browser === 'Android Browser') {
- // doesn't harm in general, but is not required anywhere else
- up.trigger('UploadProgress', file);
- }
- } else {
- file.loaded = file.size;
- }
-
- chunkBlob = formData = null; // Free memory
-
- // Check if file is uploaded
- if (!offset || offset >= blob.size) {
- // If file was modified, destory the copy
- if (file.size != file.origSize) {
- blob.destroy();
- blob = null;
- }
-
- up.trigger('UploadProgress', file);
-
- file.status = plupload.DONE;
-
- up.trigger('FileUploaded', file, {
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
- } else {
- // Still chunks left
- delay(uploadNextChunk, 1); // run detached, otherwise event handlers interfere
- }
- };
-
- xhr.onerror = function() {
- handleError();
- };
-
- xhr.onloadend = function() {
- this.destroy();
- xhr = null;
- };
-
- // Build multipart request
- if (up.settings.multipart && features.multipart) {
-
- args.name = file.target_name || file.name;
-
- xhr.open("post", url, true);
-
- // Set custom headers
- plupload.each(up.settings.headers, function(value, name) {
- xhr.setRequestHeader(name, value);
- });
-
- formData = new o.FormData();
-
- // Add multipart params
- plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) {
- formData.append(name, value);
- });
-
- // Add file and send it
- formData.append(up.settings.file_data_name, chunkBlob);
- xhr.send(formData, {
- runtime_order: up.settings.runtimes,
- required_caps: up.settings.required_features,
- preferred_caps: preferred_caps,
- swf_url: up.settings.flash_swf_url,
- xap_url: up.settings.silverlight_xap_url
- });
- } else {
- // if no multipart, send as binary stream
- url = plupload.buildUrl(up.settings.url, plupload.extend(args, up.settings.multipart_params));
-
- xhr.open("post", url, true);
-
- xhr.setRequestHeader('Content-Type', 'application/octet-stream'); // Binary stream header
-
- // Set custom headers
- plupload.each(up.settings.headers, function(value, name) {
- xhr.setRequestHeader(name, value);
- });
-
- xhr.send(chunkBlob, {
- runtime_order: up.settings.runtimes,
- required_caps: up.settings.required_features,
- preferred_caps: preferred_caps,
- swf_url: up.settings.flash_swf_url,
- xap_url: up.settings.silverlight_xap_url
- });
- }
- }
-
- blob = file.getSource();
-
- // Start uploading chunks
- if (up.settings.resize.enabled && runtimeCan(blob, 'send_binary_string') && !!~o.inArray(blob.type, ['image/jpeg', 'image/png'])) {
- // Resize if required
- resizeImage.call(this, blob, up.settings.resize, function(resizedBlob) {
- blob = resizedBlob;
- file.size = resizedBlob.size;
- uploadNextChunk();
- });
- } else {
- uploadNextChunk();
- }
- }
-
-
- function onUploadProgress(up, file) {
- calcFile(file);
- }
-
-
- function onStateChanged(up) {
- if (up.state == plupload.STARTED) {
- // Get start time to calculate bps
- startTime = (+new Date());
- } else if (up.state == plupload.STOPPED) {
- // Reset currently uploading files
- for (var i = up.files.length - 1; i >= 0; i--) {
- if (up.files[i].status == plupload.UPLOADING) {
- up.files[i].status = plupload.QUEUED;
- calc();
- }
- }
- }
- }
-
-
- function onCancelUpload() {
- if (xhr) {
- xhr.abort();
- }
- }
-
-
- function onFileUploaded(up) {
- calc();
-
- // Upload next file but detach it from the error event
- // since other custom listeners might want to stop the queue
- delay(function() {
- uploadNext.call(up);
- }, 1);
- }
-
-
- function onError(up, err) {
- // Set failed status if an error occured on a file
- if (err.file) {
- err.file.status = plupload.FAILED;
- calcFile(err.file);
-
- // Upload next file but detach it from the error event
- // since other custom listeners might want to stop the queue
- if (up.state == plupload.STARTED) { // upload in progress
- up.trigger('CancelUpload');
- delay(function() {
- uploadNext.call(up);
- }, 1);
- }
- }
- }
-
-
- function onDestroy(up) {
- up.stop();
-
- // Purge the queue
- plupload.each(files, function(file) {
- file.destroy();
- });
- files = [];
-
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.destroy();
- });
- fileInputs = [];
- }
-
- if (fileDrops.length) {
- plupload.each(fileDrops, function(fileDrop) {
- fileDrop.destroy();
- });
- fileDrops = [];
- }
-
- preferred_caps = {};
- disabled = false;
- startTime = xhr = null;
- total.reset();
- }
-
-
- // Default settings
- settings = {
- runtimes: o.Runtime.order,
- max_retries: 0,
- chunk_size: 0,
- multipart: true,
- multi_selection: true,
- file_data_name: 'file',
- flash_swf_url: 'js/Moxie.swf',
- silverlight_xap_url: 'js/Moxie.xap',
- filters: {
- mime_types: [],
- prevent_duplicates: false,
- max_file_size: 0
- },
- resize: {
- enabled: false,
- preserve_headers: true,
- crop: false
- },
- send_chunk_number: true // whether to send chunks and chunk numbers, or total and offset bytes
- };
-
-
- setOption.call(this, options, null, true);
-
- // Inital total state
- total = new plupload.QueueProgress();
-
- // Add public methods
- plupload.extend(this, {
-
- /**
- * Unique id for the Uploader instance.
- *
- * @property id
- * @type String
- */
- id : uid,
- uid : uid, // mOxie uses this to differentiate between event targets
-
- /**
- * Current state of the total uploading progress. This one can either be plupload.STARTED or plupload.STOPPED.
- * These states are controlled by the stop/start methods. The default value is STOPPED.
- *
- * @property state
- * @type Number
- */
- state : plupload.STOPPED,
-
- /**
- * Map of features that are available for the uploader runtime. Features will be filled
- * before the init event is called, these features can then be used to alter the UI for the end user.
- * Some of the current features that might be in this map is: dragdrop, chunks, jpgresize, pngresize.
- *
- * @property features
- * @type Object
- */
- features : {},
-
- /**
- * Current runtime name.
- *
- * @property runtime
- * @type String
- */
- runtime : null,
-
- /**
- * Current upload queue, an array of File instances.
- *
- * @property files
- * @type Array
- * @see plupload.File
- */
- files : files,
-
- /**
- * Object with name/value settings.
- *
- * @property settings
- * @type Object
- */
- settings : settings,
-
- /**
- * Total progess information. How many files has been uploaded, total percent etc.
- *
- * @property total
- * @type plupload.QueueProgress
- */
- total : total,
-
-
- /**
- * Initializes the Uploader instance and adds internal event listeners.
- *
- * @method init
- */
- init : function() {
- var self = this;
-
- if (typeof(settings.preinit) == "function") {
- settings.preinit(self);
- } else {
- plupload.each(settings.preinit, function(func, name) {
- self.bind(name, func);
- });
- }
-
- // Check for required options
- if (!settings.browse_button || !settings.url) {
- this.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate('Init error.')
- });
- return;
- }
-
- bindEventListeners.call(this);
-
- initControls.call(this, settings, function(inited) {
- if (typeof(settings.init) == "function") {
- settings.init(self);
- } else {
- plupload.each(settings.init, function(func, name) {
- self.bind(name, func);
- });
- }
-
- if (inited) {
- self.runtime = o.Runtime.getInfo(getRUID()).type;
- self.trigger('Init', { runtime: self.runtime });
- self.trigger('PostInit');
- } else {
- self.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate('Init error.')
- });
- }
- });
- },
-
- /**
- * Set the value for the specified option(s).
- *
- * @method setOption
- * @since 2.1
- * @param {String|Object} option Name of the option to change or the set of key/value pairs
- * @param {Mixed} [value] Value for the option (is ignored, if first argument is object)
- */
- setOption: function(option, value) {
- setOption.call(this, option, value, !this.runtime); // until runtime not set we do not need to reinitialize
- },
-
- /**
- * Get the value for the specified option or the whole configuration, if not specified.
- *
- * @method getOption
- * @since 2.1
- * @param {String} [option] Name of the option to get
- * @return {Mixed} Value for the option or the whole set
- */
- getOption: function(option) {
- if (!option) {
- return settings;
- }
- return settings[option];
- },
-
- /**
- * Refreshes the upload instance by dispatching out a refresh event to all runtimes.
- * This would for example reposition flash/silverlight shims on the page.
- *
- * @method refresh
- */
- refresh : function() {
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.trigger('Refresh');
- });
- }
- this.trigger('Refresh');
- },
-
- /**
- * Starts uploading the queued files.
- *
- * @method start
- */
- start : function() {
- if (this.state != plupload.STARTED) {
- this.state = plupload.STARTED;
- this.trigger('StateChanged');
-
- uploadNext.call(this);
- }
- },
-
- /**
- * Stops the upload of the queued files.
- *
- * @method stop
- */
- stop : function() {
- if (this.state != plupload.STOPPED) {
- this.state = plupload.STOPPED;
- this.trigger('StateChanged');
- this.trigger('CancelUpload');
- }
- },
-
-
- /**
- * Disables/enables browse button on request.
- *
- * @method disableBrowse
- * @param {Boolean} disable Whether to disable or enable (default: true)
- */
- disableBrowse : function() {
- disabled = arguments[0] !== undef ? arguments[0] : true;
-
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.disable(disabled);
- });
- }
-
- this.trigger('DisableBrowse', disabled);
- },
-
- /**
- * Returns the specified file object by id.
- *
- * @method getFile
- * @param {String} id File id to look for.
- * @return {plupload.File} File object or undefined if it wasn't found;
- */
- getFile : function(id) {
- var i;
- for (i = files.length - 1; i >= 0; i--) {
- if (files[i].id === id) {
- return files[i];
- }
- }
- },
-
- /**
- * Adds file to the queue programmatically. Can be native file, instance of Plupload.File,
- * instance of mOxie.File, input[type="file"] element, or array of these. Fires FilesAdded,
- * if any files were added to the queue. Otherwise nothing happens.
- *
- * @method addFile
- * @since 2.0
- * @param {plupload.File|mOxie.File|File|Node|Array} file File or files to add to the queue.
- * @param {String} [fileName] If specified, will be used as a name for the file
- */
- addFile : function(file, fileName) {
- var self = this
- , queue = []
- , files = []
- , ruid
- ;
-
- function filterFile(file, cb) {
- var queue = [];
- o.each(self.settings.filters, function(rule, name) {
- if (fileFilters[name]) {
- queue.push(function(cb) {
- fileFilters[name].call(self, rule, file, function(res) {
- cb(!res);
- });
- });
- }
- });
- o.inSeries(queue, cb);
- }
-
- /**
- * @method resolveFile
- * @private
- * @param {o.File|o.Blob|plupload.File|File|Blob|input[type="file"]} file
- */
- function resolveFile(file) {
- var type = o.typeOf(file);
-
- // o.File
- if (file instanceof o.File) {
- if (!file.ruid && !file.isDetached()) {
- if (!ruid) { // weird case
- return false;
- }
- file.ruid = ruid;
- file.connectRuntime(ruid);
- }
- resolveFile(new plupload.File(file));
- }
- // o.Blob
- else if (file instanceof o.Blob) {
- resolveFile(file.getSource());
- file.destroy();
- }
- // plupload.File - final step for other branches
- else if (file instanceof plupload.File) {
- if (fileName) {
- file.name = fileName;
- }
-
- queue.push(function(cb) {
- // run through the internal and user-defined filters, if any
- filterFile(file, function(err) {
- if (!err) {
- files.push(file);
- self.trigger("FileFiltered", file);
- }
- delay(cb, 1); // do not build up recursions or eventually we might hit the limits
- });
- });
- }
- // native File or blob
- else if (o.inArray(type, ['file', 'blob']) !== -1) {
- resolveFile(new o.File(null, file));
- }
- // input[type="file"]
- else if (type === 'node' && o.typeOf(file.files) === 'filelist') {
- // if we are dealing with input[type="file"]
- o.each(file.files, resolveFile);
- }
- // mixed array of any supported types (see above)
- else if (type === 'array') {
- fileName = null; // should never happen, but unset anyway to avoid funny situations
- o.each(file, resolveFile);
- }
- }
-
- ruid = getRUID();
-
- resolveFile(file);
-
- if (queue.length) {
- o.inSeries(queue, function() {
- // if any files left after filtration, trigger FilesAdded
- if (files.length) {
- self.trigger("FilesAdded", files);
- }
- });
- }
- },
-
- /**
- * Removes a specific file.
- *
- * @method removeFile
- * @param {plupload.File|String} file File to remove from queue.
- */
- removeFile : function(file) {
- var id = typeof(file) === 'string' ? file : file.id;
-
- for (var i = files.length - 1; i >= 0; i--) {
- if (files[i].id === id) {
- return this.splice(i, 1)[0];
- }
- }
- },
-
- /**
- * Removes part of the queue and returns the files removed. This will also trigger the FilesRemoved and QueueChanged events.
- *
- * @method splice
- * @param {Number} start (Optional) Start index to remove from.
- * @param {Number} length (Optional) Lengh of items to remove.
- * @return {Array} Array of files that was removed.
- */
- splice : function(start, length) {
- // Splice and trigger events
- var removed = files.splice(start === undef ? 0 : start, length === undef ? files.length : length);
-
- // if upload is in progress we need to stop it and restart after files are removed
- var restartRequired = false;
- if (this.state == plupload.STARTED) { // upload in progress
- restartRequired = true;
- this.stop();
- }
-
- this.trigger("FilesRemoved", removed);
-
- // Dispose any resources allocated by those files
- plupload.each(removed, function(file) {
- file.destroy();
- });
-
- this.trigger("QueueChanged");
- this.refresh();
-
- if (restartRequired) {
- this.start();
- }
-
- return removed;
- },
-
- /**
- * Dispatches the specified event name and it's arguments to all listeners.
- *
- *
- * @method trigger
- * @param {String} name Event name to fire.
- * @param {Object..} Multiple arguments to pass along to the listener functions.
- */
-
- /**
- * Check whether uploader has any listeners to the specified event.
- *
- * @method hasEventListener
- * @param {String} name Event name to check for.
- */
-
-
- /**
- * Adds an event listener by name.
- *
- * @method bind
- * @param {String} name Event name to listen for.
- * @param {function} func Function to call ones the event gets fired.
- * @param {Object} scope Optional scope to execute the specified function in.
- */
- bind : function(name, func, scope) {
- var self = this;
- // adapt moxie EventTarget style to Plupload-like
- plupload.Uploader.prototype.bind.call(this, name, function() {
- var args = [].slice.call(arguments);
- args.splice(0, 1, self); // replace event object with uploader instance
- return func.apply(this, args);
- }, 0, scope);
- },
-
- /**
- * Removes the specified event listener.
- *
- * @method unbind
- * @param {String} name Name of event to remove.
- * @param {function} func Function to remove from listener.
- */
-
- /**
- * Removes all event listeners.
- *
- * @method unbindAll
- */
-
-
- /**
- * Destroys Plupload instance and cleans after itself.
- *
- * @method destroy
- */
- destroy : function() {
- this.trigger('Destroy');
- settings = total = null; // purge these exclusively
- this.unbindAll();
- }
- });
-};
-
-plupload.Uploader.prototype = o.EventTarget.instance;
-
-/**
- * Constructs a new file instance.
- *
- * @class File
- * @constructor
- *
- * @param {Object} file Object containing file properties
- * @param {String} file.name Name of the file.
- * @param {Number} file.size File size.
- */
-plupload.File = (function() {
- var filepool = {};
-
- function PluploadFile(file) {
-
- plupload.extend(this, {
-
- /**
- * File id this is a globally unique id for the specific file.
- *
- * @property id
- * @type String
- */
- id: plupload.guid(),
-
- /**
- * File name for example "myfile.gif".
- *
- * @property name
- * @type String
- */
- name: file.name || file.fileName,
-
- /**
- * File type, `e.g image/jpeg`
- *
- * @property type
- * @type String
- */
- type: file.type || '',
-
- /**
- * File size in bytes (may change after client-side manupilation).
- *
- * @property size
- * @type Number
- */
- size: file.size || file.fileSize,
-
- /**
- * Original file size in bytes.
- *
- * @property origSize
- * @type Number
- */
- origSize: file.size || file.fileSize,
-
- /**
- * Number of bytes uploaded of the files total size.
- *
- * @property loaded
- * @type Number
- */
- loaded: 0,
-
- /**
- * Number of percentage uploaded of the file.
- *
- * @property percent
- * @type Number
- */
- percent: 0,
-
- /**
- * Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
- *
- * @property status
- * @type Number
- * @see plupload
- */
- status: plupload.QUEUED,
-
- /**
- * Date of last modification.
- *
- * @property lastModifiedDate
- * @type {String}
- */
- lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString(), // Thu Aug 23 2012 19:40:00 GMT+0400 (GET)
-
- /**
- * Returns native window.File object, when it's available.
- *
- * @method getNative
- * @return {window.File} or null, if plupload.File is of different origin
- */
- getNative: function() {
- var file = this.getSource().getSource();
- return o.inArray(o.typeOf(file), ['blob', 'file']) !== -1 ? file : null;
- },
-
- /**
- * Returns mOxie.File - unified wrapper object that can be used across runtimes.
- *
- * @method getSource
- * @return {mOxie.File} or null
- */
- getSource: function() {
- if (!filepool[this.id]) {
- return null;
- }
- return filepool[this.id];
- },
-
- /**
- * Destroys plupload.File object.
- *
- * @method destroy
- */
- destroy: function() {
- var src = this.getSource();
- if (src) {
- src.destroy();
- delete filepool[this.id];
- }
- }
- });
-
- filepool[this.id] = file;
- }
-
- return PluploadFile;
-}());
-
-
-/**
- * Constructs a queue progress.
- *
- * @class QueueProgress
- * @constructor
- */
- plupload.QueueProgress = function() {
- var self = this; // Setup alias for self to reduce code size when it's compressed
-
- /**
- * Total queue file size.
- *
- * @property size
- * @type Number
- */
- self.size = 0;
-
- /**
- * Total bytes uploaded.
- *
- * @property loaded
- * @type Number
- */
- self.loaded = 0;
-
- /**
- * Number of files uploaded.
- *
- * @property uploaded
- * @type Number
- */
- self.uploaded = 0;
-
- /**
- * Number of files failed to upload.
- *
- * @property failed
- * @type Number
- */
- self.failed = 0;
-
- /**
- * Number of files yet to be uploaded.
- *
- * @property queued
- * @type Number
- */
- self.queued = 0;
-
- /**
- * Total percent of the uploaded bytes.
- *
- * @property percent
- * @type Number
- */
- self.percent = 0;
-
- /**
- * Bytes uploaded per second.
- *
- * @property bytesPerSec
- * @type Number
- */
- self.bytesPerSec = 0;
-
- /**
- * Resets the progress to it's initial values.
- *
- * @method reset
- */
- self.reset = function() {
- self.size = self.loaded = self.uploaded = self.failed = self.queued = self.percent = self.bytesPerSec = 0;
- };
-};
-
-window.plupload = plupload;
-
-}(window, mOxie));
diff --git a/demo/js/plupload/plupload.full.min.js b/demo/js/plupload/plupload.full.min.js
deleted file mode 100644
index 69d6ad12..00000000
--- a/demo/js/plupload/plupload.full.min.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill
- * v1.2.0
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-!function(e,t){"use strict";function n(e,t){for(var n,i=[],r=0;r0&&n(o,function(n,o){n!==r&&(e(i[o])===e(n)&&~a(e(n),["array","object"])?t(i[o],n):i[o]=n)})}),i},n=function(e,t){var n,i,r,o;if(e){try{n=e.length}catch(a){n=o}if(n===o){for(i in e)if(e.hasOwnProperty(i)&&t(e[i],i)===!1)return}else for(r=0;n>r;r++)if(t(e[r],r)===!1)return}},i=function(t){var n;if(!t||"object"!==e(t))return!0;for(n in t)return!1;return!0},r=function(t,n){function i(r){"function"===e(t[r])&&t[r](function(e){++rn;n++)if(t[n]===e)return n}return-1},s=function(t,n){var i=[];"array"!==e(t)&&(t=[t]),"array"!==e(n)&&(n=[n]);for(var r in t)-1===a(t[r],n)&&i.push(t[r]);return i.length?i:!1},u=function(e,t){var i=[];return n(e,function(e){-1!==a(e,t)&&i.push(e)}),i.length?i:null},c=function(e){var t,n=[];for(t=0;ti;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}(),d=function(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e},f=function(e){if("string"!=typeof e)return e;var t={t:1099511627776,g:1073741824,m:1048576,k:1024},n;return e=/^([0-9]+)([mgk]?)$/.exec(e.toLowerCase().replace(/[^0-9mkg]/g,"")),n=e[2],e=+e[1],t.hasOwnProperty(n)&&(e*=t[n]),e};return{guid:l,typeOf:e,extend:t,each:n,isEmptyObj:i,inSeries:r,inParallel:o,inArray:a,arrayDiff:s,arrayIntersect:u,toArray:c,trim:d,parseSizeStr:f}}),i(c,[u],function(e){var t={};return{addI18n:function(n){return e.extend(t,n)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var n=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=n.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),i(l,[u,c],function(e,t){var n="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",i={mimes:{},extensions:{},addMimeType:function(e){var t=e.split(/,/),n,i,r;for(n=0;ni;i++)if(e[i]!=t[i]){if(e[i]=u(e[i]),t[i]=u(t[i]),e[i]t[i]){o=1;break}}if(!n)return o;switch(n){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",n="?",i="function",r="undefined",o="object",a="major",s="model",u="name",c="type",l="vendor",d="version",f="architecture",p="console",h="mobile",m="tablet",g={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},v={rgx:function(){for(var t,n=0,a,s,u,c,l,d,f=arguments;n0?2==c.length?t[c[0]]=typeof c[1]==i?c[1].call(this,d):c[1]:3==c.length?t[c[0]]=typeof c[1]!==i||c[1].exec&&c[1].test?d?d.replace(c[1],c[2]):e:d?c[1].call(this,d,c[2]):e:4==c.length&&(t[c[0]]=d?c[3].call(this,d.replace(c[1],c[2])):e):t[c]=d?d:e;break}if(l)break}return t},str:function(t,i){for(var r in i)if(typeof i[r]===o&&i[r].length>0){for(var a=0;a=9)},use_data_uri_of:function(e){return t.use_data_uri&&33e3>e||t.use_data_uri_over32kb()},use_fileinput:function(){var e=document.createElement("input");return e.setAttribute("type","file"),!e.disabled}};return function(n){var i=[].slice.call(arguments);return i.shift(),"function"===e.typeOf(t[n])?t[n].apply(this,i):!!t[n]}}(),r={can:i,browser:n.browser.name,version:parseFloat(n.browser.major),os:n.os.name,osVersion:n.os.version,verComp:t,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return r.OS=r.os,r}),i(f,[d],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},n=function(e,t){if(!e.className)return!1;var n=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return n.test(e.className)},i=function(e,t){n(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var n=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(n,function(e,t,n){return" "===t&&" "===n?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,n){function i(e){var t,n,i=0,r=0;return e&&(n=e.getBoundingClientRect(),t="CSS1Compat"===s.compatMode?s.documentElement:s.body,i=n.left+t.scrollLeft,r=n.top+t.scrollTop),{x:i,y:r}}var r=0,o=0,a,s=document,u,c;if(t=t,n=n||s.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!s.documentMode||s.documentMode<8))return u=i(t),c=i(n),{x:u.x-c.x,y:u.y-c.y};for(a=t;a&&a!=n&&a.nodeType;)r+=a.offsetLeft||0,o+=a.offsetTop||0,a=a.offsetParent;for(a=t.parentNode;a&&a!=n&&a.nodeType;)r-=a.scrollLeft||0,o-=a.scrollTop||0,a=a.parentNode;return{x:r,y:o}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:n,addClass:i,removeClass:r,getStyle:o,getPos:a,getSize:s}}),i(p,[u],function(e){function t(e,t){var n;for(n in e)if(e[n]===t)return n;return null}return{RuntimeError:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": RuntimeError "+this.code}var i={NOT_INIT_ERR:1,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(n,i),n.prototype=Error.prototype,n}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": ImageError "+this.code}var i={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2};return e.extend(n,i),n.prototype=Error.prototype,n}(),FileException:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": FileException "+this.code}var i={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(n,i),n.prototype=Error.prototype,n}(),DOMException:function(){function n(e){this.code=e,this.name=t(i,e),this.message=this.name+": DOMException "+this.code}var i={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(n,i),n.prototype=Error.prototype,n}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),i(h,[p,u],function(e,t){function n(){var n={};t.extend(this,{uid:null,init:function(){this.uid||(this.uid=t.guid("uid_"))},addEventListener:function(e,i,r,o){var a=this,s;return e=t.trim(e),/\s/.test(e)?(t.each(e.split(/\s+/),function(e){a.addEventListener(e,i,r,o)}),void 0):(e=e.toLowerCase(),r=parseInt(r,10)||0,s=n[this.uid]&&n[this.uid][e]||[],s.push({fn:i,priority:r,scope:o||this}),n[this.uid]||(n[this.uid]={}),n[this.uid][e]=s,void 0)},hasEventListener:function(e){return e?!(!n[this.uid]||!n[this.uid][e]):!!n[this.uid]},removeEventListener:function(e,i){e=e.toLowerCase();var r=n[this.uid]&&n[this.uid][e],o;if(r){if(i){for(o=r.length-1;o>=0;o--)if(r[o].fn===i){r.splice(o,1);break}}else r=[];r.length||(delete n[this.uid][e],t.isEmptyObj(n[this.uid])&&delete n[this.uid])}},removeAllEventListeners:function(){n[this.uid]&&delete n[this.uid]},dispatchEvent:function(i){var r,o,a,s,u={},c=!0,l;if("string"!==t.typeOf(i)){if(s=i,"string"!==t.typeOf(s.type))throw new e.EventException(e.EventException.UNSPECIFIED_EVENT_TYPE_ERR);i=s.type,s.total!==l&&s.loaded!==l&&(u.total=s.total,u.loaded=s.loaded),u.async=s.async||!1}if(-1!==i.indexOf("::")?function(e){r=e[0],i=e[1]}(i.split("::")):r=this.uid,i=i.toLowerCase(),o=n[r]&&n[r][i]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),u.type=i,a.unshift(u);var d=[];t.each(o,function(e){a[0].target=e.scope,u.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&t.inSeries(d,function(e){c=!e})}return c},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},convertEventPropsToHandlers:function(e){var n;"array"!==t.typeOf(e)&&(e=[e]);for(var i=0;i>16,o=255&d>>8,a=255&d,m[p++]=64==c?String.fromCharCode(r):64==l?String.fromCharCode(r,o):String.fromCharCode(r,o,a);while(f>18,u=63&d>>12,c=63&d>>6,l=63&d,m[p++]=i.charAt(s)+i.charAt(u)+i.charAt(c)+i.charAt(l);while(fa;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return i.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return i.call(this,"readAsDataURL",e)},readAsText:function(e){return i.call(this,"readAsText",e)}})}}),i(S,[p,u,y],function(e,t,n){function i(){var e,i=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof n?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):i.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(n){t.each(i,function(e){n(e.value,e.name)}),e&&n(e.value,e.name)},destroy:function(){e=null,i=[]}})}return i}),i(A,[u,p,h,m,b,g,x,y,T,S,d,l],function(e,t,n,i,r,o,a,s,u,c,l,d){function f(){this.uid=e.guid("uid_")}function p(){function n(e,t){return y.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?y[e]:v[e]:(l.can("define_property")?y[e]=t:v[e]=t,void 0):void 0}function u(t){function i(){k.destroy(),k=null,s.dispatchEvent("loadend"),s=null}function r(r){k.bind("LoadStart",function(e){n("readyState",p.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),I&&s.upload.dispatchEvent(e)}),k.bind("Progress",function(e){n("readyState")!==p.LOADING&&(n("readyState",p.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),k.bind("UploadProgress",function(e){I&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),k.bind("Load",function(t){n("readyState",p.DONE),n("status",Number(r.exec.call(k,"XMLHttpRequest","getStatus")||0)),n("statusText",h[n("status")]||""),n("response",r.exec.call(k,"XMLHttpRequest","getResponse",n("responseType"))),~e.inArray(n("responseType"),["text",""])?n("responseText",n("response")):"document"===n("responseType")&&n("responseXML",n("response")),U=r.exec.call(k,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),n("status")>0?(I&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(N=!0,s.dispatchEvent("error")),i()}),k.bind("Abort",function(e){s.dispatchEvent(e),i()}),k.bind("Error",function(e){N=!0,n("readyState",p.DONE),s.dispatchEvent("readystatechange"),D=!0,s.dispatchEvent(e),i()}),r.exec.call(k,"XMLHttpRequest","send",{url:E,method:_,async:w,user:R,password:b,headers:x,mimeType:S,encoding:T,responseType:s.responseType,withCredentials:s.withCredentials,options:P},t)}var s=this;M=(new Date).getTime(),k=new a,"string"==typeof P.required_caps&&(P.required_caps=o.parseCaps(P.required_caps)),P.required_caps=e.extend({},P.required_caps,{return_response_type:s.responseType}),t instanceof c&&(P.required_caps.send_multipart=!0),L||(P.required_caps.do_cors=!0),P.ruid?r(k.connectRuntime(P)):(k.bind("RuntimeInit",function(e,t){r(t)}),k.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),k.connectRuntime(P))}function g(){n("responseText",""),n("responseXML",null),n("response",null),n("status",0),n("statusText",""),M=C=null}var v=this,y={timeout:0,readyState:p.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},w=!0,E,_,x={},R,b,T=null,S=null,A=!1,O=!1,I=!1,D=!1,N=!1,L=!1,M,C,F=null,H=null,P={},k,U="",B;e.extend(this,y,{uid:e.guid("uid_"),upload:new f,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||i.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(_=o.toUpperCase()),~e.inArray(_,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=i.utf8_encode(a),l=r.parseUrl(a),L=r.hasSameOrigin(l),E=r.resolveUrl(a),(u||c)&&!L)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(R=u||l.user,b=c||l.pass,w=s||!0,w===!1&&(n("timeout")||n("withCredentials")||""!==n("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);A=!w,O=!1,x={},g.call(this),n("readyState",p.OPENED),this.convertEventPropsToHandlers(["readystatechange"]),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(n("readyState")!==p.OPENED||O)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||i.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(x[r]?x[r]+=", "+o:x[r]=o,!0)},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),N||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(B||(B={},e.each(U.split(/\r\n/),function(t){var n=t.split(/:\s+/);2===n.length&&(n[0]=e.trim(n[0]),B[n[0].toLowerCase()]={header:n[0],value:e.trim(n[1])})})),B.hasOwnProperty(t))?B[t].header+": "+B[t].value:null},overrideMimeType:function(i){var r,o;if(~e.inArray(n("readyState"),[p.LOADING,p.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i=e.trim(i.toLowerCase()),/;/.test(i)&&(r=i.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(i=r[1],r[2]&&(o=r[2])),!d.mimes[i])throw new t.DOMException(t.DOMException.SYNTAX_ERR);F=i,H=o},send:function(n,r){if(P="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.convertEventPropsToHandlers(m),this.upload.convertEventPropsToHandlers(m),this.readyState!==p.OPENED||O)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n instanceof s)P.ruid=n.ruid,S=n.type||"application/octet-stream";else if(n instanceof c){if(n.hasBlob()){var o=n.getBlob();P.ruid=o.ruid,S=o.type||"application/octet-stream"}}else"string"==typeof n&&(T="UTF-8",S="text/plain;charset=UTF-8",n=i.utf8_encode(n));this.withCredentials||(this.withCredentials=P.required_caps&&P.required_caps.send_browser_cookies&&!L),I=!A&&this.upload.hasEventListener(),N=!1,D=!n,A||(O=!0),u.call(this,n)},abort:function(){if(N=!0,A=!1,~e.inArray(n("readyState"),[p.UNSENT,p.OPENED,p.DONE]))n("readyState",p.UNSENT);else{if(n("readyState",p.DONE),O=!1,!k)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);k.getRuntime().exec.call(k,"XMLHttpRequest","abort",D),D=!0}},destroy:function(){k&&("function"===e.typeOf(k.destroy)&&k.destroy(),k=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}})}var h={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};f.prototype=n.instance;var m=["loadstart","progress","abort","error","load","timeout","loadend"],g=1,v=2;return p.UNSENT=0,p.OPENED=1,p.HEADERS_RECEIVED=2,p.LOADING=3,p.DONE=4,p.prototype=n.instance,p}),i(O,[u,m,v,h],function(e,t,n,i){function r(){function i(){l=d=0,c=this.result=null}function o(t,n){var i=this;u=n,i.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(i.state,[r.IDLE,r.DONE])&&a.call(i)},999),i.bind("TransportingComplete",function(){d=l,i.state=r.DONE,c=null,i.result=u.exec.call(i,"Transporter","getAsBlob",t||"")},999),i.state=r.BUSY,i.trigger("TransportingStarted"),a.call(i)}function a(){var e=this,n,i=l-d;f>i&&(f=i),n=t.btoa(c.substr(d,f)),u.exec.call(e,"Transporter","receive",n,l)}var s,u,c,l,d,f;n.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,n,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),f=r.chunk_size,i.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,n,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,n,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),i.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),i.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=i.instance,r}),i(I,[u,f,p,T,A,g,v,O,d,h,y,w,m],function(e,t,n,i,r,o,a,s,u,c,l,d,f){function p(){function i(e){e||(e=this.getRuntime().exec.call(this,"Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name)}function c(t){var i=e.typeOf(t);try{if(t instanceof p){if(!t.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);m.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new n.ImageError(n.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(i,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===i)/^data:[^;]*;base64,/.test(t)?c.call(this,new l(null,{data:t}),arguments[1]):v.apply(this,arguments);else{if("node"!==i||"img"!==t.nodeName.toLowerCase())throw new n.DOMException(n.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r)}}function m(t,n){var i=this.connectRuntime(t.ruid);this.ruid=i.uid,i.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(n)?!0:n)}function g(t,n){function i(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){i(t)}),n&&"string"==typeof n.required_caps&&(n.required_caps=o.parseCaps(n.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},n))):i(this.connectRuntime(t.ruid))}function v(e,t){var n=this,i;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){this.bind("Load Resize",function(){i.call(this)},999),this.convertEventPropsToHandlers(h),c.apply(this,arguments)},downsize:function(t,i,r,o){try{if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);if(this.width>p.MAX_RESIZE_WIDTH||this.height>p.MAX_RESIZE_HEIGHT)throw new n.ImageError(n.ImageError.MAX_RESOLUTION_ERR);(!t&&!i||"undefined"===e.typeOf(r))&&(r=!1),t=t||this.width,i=i||this.height,o="undefined"===e.typeOf(o)?!0:!!o,this.getRuntime().exec.call(this,"Image","downsize",t,i,r,o)}catch(a){this.trigger("error",a)}},crop:function(e,t,n){this.downsize(e,t,!0,n)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);var e=this.connectRuntime(this.ruid);return e.exec.call(this,"Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return e||(e="image/jpeg"),"image/jpeg"!==e||t||(t=90),this.getRuntime().exec.call(this,"Image","getAsBlob",e,t)},getAsDataURL:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return this.getRuntime().exec.call(this,"Image","getAsDataURL",e,t)},getAsBinaryString:function(e,t){var n=this.getAsDataURL(e,t);return f.atob(n.substring(n.indexOf("base64,")+7))},embed:function(i){function r(){if(u.can("create_canvas")){var t=a.getAsCanvas();if(t)return i.appendChild(t),t=null,a.destroy(),o.trigger("embedded"),void 0}var r=a.getAsDataURL(c,l);if(!r)throw new n.ImageError(n.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",r.length))i.innerHTML=' ',a.destroy(),o.trigger("embedded");else{var d=new s;d.bind("TransportingComplete",function(){v=o.connectRuntime(this.result.ruid),o.bind("Embedded",function(){e.extend(v.getShimContainer().style,{top:"0px",left:"0px",width:a.width+"px",height:a.height+"px"}),v=null},999),v.exec.call(o,"ImageView","display",this.result.uid,m,g),a.destroy()}),d.transport(f.atob(r.substring(r.indexOf("base64,")+7)),c,e.extend({},h,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:i}))}}var o=this,a,c,l,d,h=arguments[1]||{},m=this.width,g=this.height,v;try{if(!(i=t.get(i)))throw new n.DOMException(n.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);if(this.width>p.MAX_RESIZE_WIDTH||this.height>p.MAX_RESIZE_HEIGHT)throw new n.ImageError(n.ImageError.MAX_RESOLUTION_ERR);if(c=h.type||this.type||"image/jpeg",l=h.quality||90,d="undefined"!==e.typeOf(h.crop)?h.crop:!1,h.width)m=h.width,g=h.height||m;else{var y=t.getSize(i);y.w&&y.h&&(m=y.w,g=y.h)}return a=new p,a.bind("Resize",function(){r.call(o)}),a.bind("Load",function(){a.downsize(m,g,d,!1)}),a.clone(this,!1),a}catch(w){this.trigger("error",w)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.unbindAll()}})}var h=["progress","load","error","resize","embedded"];return p.MAX_RESIZE_WIDTH=6500,p.MAX_RESIZE_HEIGHT=6500,p.prototype=c.instance,p}),i(D,[u,p,g,d],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue,c=e.extend({access_binary:s(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return r.can("access_binary")&&!!a.Image},display_media:s(i.can("create_canvas")||i.can("use_data_uri_over32kb")),do_cors:s(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:s(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==i.browser||i.version>9)}()),filter_by_extension:s(function(){return"Chrome"===i.browser&&i.version>=28||"IE"===i.browser&&i.version>=10}()),return_response_headers:u,return_response_type:function(e){return"json"===e&&window.JSON?!0:i.can("return_response_type",e)},return_status_code:u,report_upload_progress:s(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return r.can("access_binary")&&i.can("create_canvas")},select_file:function(){return i.can("use_fileinput")&&window.File},select_folder:function(){return r.can("select_file")&&"Chrome"===i.browser&&i.version>=21},select_multiple:function(){return!(!r.can("select_file")||"Safari"===i.browser&&"Windows"===i.os||"iOS"===i.os&&i.verComp(i.osVersion,"7.0.4","<"))},send_binary_string:s(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:s(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||r.can("send_binary_string")},slice_blob:s(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return r.can("slice_blob")&&r.can("send_multipart")},summon_file_dialog:s(function(){return"Firefox"===i.browser&&i.version>=4||"Opera"===i.browser&&i.version>=12||"IE"===i.browser&&i.version>=10||!!~e.inArray(i.browser,["Chrome","Safari"])}()),upload_filesize:u},arguments[2]);n.call(this,t,arguments[1]||o,c),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html5",a={};return n.addConstructor(o,r),a}),i(N,[D,y],function(e,t){function n(){function e(e,t,n){var i;if(!window.File.prototype.slice)return(i=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?i.call(e,t,n):null;try{return e.slice(),e.slice(t,n)}catch(r){return e.slice(t,n-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))}}return e.Blob=n}),i(L,[u],function(e){function t(){this.returnValue=!1}function n(){this.cancelBubble=!0}var i={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=n,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),i.hasOwnProperty(o[r])||(i[o[r]]={}),l=i[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,n,o){var a,s;if(n=n.toLowerCase(),t[r]&&i[t[r]]&&i[t[r]][n]){a=i[t[r]][n];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(n,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+n,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete i[t[r]][n],e.isEmptyObj(i[t[r]])){delete i[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,n){t&&t[r]&&e.each(i[t[r]],function(e,i){a(t,i,n)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),i(M,[D,u,f,L,l,d],function(e,t,n,i,r,o){function a(){var e=[],a;t.extend(this,{init:function(s){var u=this,c=u.getRuntime(),l,d,f,p,h,m;a=s,e=[],f=a.accept.mimes||r.extList2mimes(a.accept,c.can("filter_by_extension")),d=c.getShimContainer(),d.innerHTML=' ",l=n.get(c.uid),t.extend(l.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),p=n.get(a.browse_button),c.can("summon_file_dialog")&&("static"===n.getStyle(p,"position")&&(p.style.position="relative"),h=parseInt(n.getStyle(p,"z-index"),10)||1,p.style.zIndex=h,d.style.zIndex=h-1,i.addEvent(p,"click",function(e){var t=n.get(c.uid);t&&!t.disabled&&t.click(),e.preventDefault()},u.uid)),m=c.can("summon_file_dialog")?p:d,i.addEvent(m,"mouseover",function(){u.trigger("mouseenter")},u.uid),i.addEvent(m,"mouseout",function(){u.trigger("mouseleave")},u.uid),i.addEvent(m,"mousedown",function(){u.trigger("mousedown")},u.uid),i.addEvent(n.get(a.container),"mouseup",function(){u.trigger("mouseup")},u.uid),l.onchange=function g(){if(e=[],a.directory?t.each(this.files,function(t){"."!==t.name&&e.push(t)}):e=[].slice.call(this.files),"IE"!==o.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=g}u.trigger("change")},u.trigger({type:"ready",async:!0}),d=null},getFiles:function(){return e},disable:function(e){var t=this.getRuntime(),i;(i=n.get(t.uid))&&(i.disabled=!!e)},destroy:function(){var t=this.getRuntime(),r=t.getShim(),o=t.getShimContainer();i.removeAllEvents(o,this.uid),i.removeAllEvents(a&&n.get(a.container),this.uid),i.removeAllEvents(a&&n.get(a.browse_button),this.uid),o&&(o.innerHTML=""),r.removeInstance(this.uid),e=a=o=r=null}})}return e.FileInput=a}),i(C,[D,u,f,L,l],function(e,t,n,i,r){function o(){function e(e){for(var n=[],i=0;i=4&&u.version<7,f="Android Browser"===u.browser,m=!1;if(h=n.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),p=c(),p.open(n.method,n.url,n.async,n.user,n.password),r instanceof o)r.isDetached()&&(m=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),m=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,n,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}p.upload?(n.withCredentials&&(p.withCredentials=!0),p.addEventListener("load",function(e){s.trigger(e)}),p.addEventListener("error",function(e){s.trigger(e)}),p.addEventListener("progress",function(e){s.trigger(e)}),p.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):p.onreadystatechange=function v(){switch(p.readyState){case 1:break;case 2:break;case 3:var e,t;try{i.hasSameOrigin(n.url)&&(e=p.getResponseHeader("Content-Length")||0),p.responseText&&(t=p.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:p.onreadystatechange=function(){},0===p.status?s.trigger("error"):s.trigger("load")}},t.isEmptyObj(n.headers)||t.each(n.headers,function(e,t){p.setRequestHeader(t,e)}),""!==n.responseType&&"responseType"in p&&(p.responseType="json"!==n.responseType||u.can("return_response_type","json")?n.responseType:"text"),m?p.sendAsBinary?p.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;ta;a++)i|=o.charCodeAt(e+a)<s;s++)o+=String.fromCharCode(255&t>>Math.abs(a+8*s));n(o,e,i)}var r=!1,o;return{II:function(e){return e===t?r:(r=e,void 0)},init:function(e){r=!1,o=e},SEGMENT:function(e,t,i){switch(arguments.length){case 1:return o.substr(e,o.length-e-1);case 2:return o.substr(e,t);case 3:n(i,e,t);break;default:return o}},BYTE:function(t){return e(t,1)},SHORT:function(t){return e(t,2)},LONG:function(n,r){return r===t?e(n,4):(i(n,r,4),void 0)},SLONG:function(t){var n=e(t,4);return n>2147483647?n-4294967296:n},STRING:function(t,n){var i="";for(n+=t;n>t;t++)i+=String.fromCharCode(e(t,1));return i}}}}),i(k,[P],function(e){return function t(n){var i=[],r,o,a,s=0;if(r=new e,r.init(n),65496===r.SHORT(0)){for(o=2;o<=n.length;)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;s=r.SHORT(o+2)+2,a>=65505&&65519>=a&&i.push({hex:a,name:"APP"+(15&a),start:o,length:s,segment:r.SEGMENT(o,s)}),o+=s}return r.init(null),{headers:i,restore:function(e){var t,n;for(r.init(e),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,t=i.length;t>n;n++)r.SEGMENT(o,0,i[n].segment),o+=i[n].length;return e=r.SEGMENT(),r.init(null),e},strip:function(e){var n,i,o;for(i=new t(e),n=i.headers,i.purge(),r.init(e),o=n.length;o--;)r.SEGMENT(n[o].start,n[o].length,"");return e=r.SEGMENT(),r.init(null),e},get:function(e){for(var t=[],n=0,r=i.length;r>n;n++)i[n].name===e.toUpperCase()&&t.push(i[n].segment);return t},set:function(e,t){var n=[],r,o,a;for("string"==typeof t?n.push(t):n=t,r=o=0,a=i.length;a>r&&(i[r].name===e.toUpperCase()&&(i[r].segment=n[o],i[r].length=n[o].length,o++),!(o>=n.length));r++);},purge:function(){i=[],r.init(null),r=null}}}}}),i(U,[u,P],function(e,n){return function i(){function i(e,n){var i=a.SHORT(e),r,o,s,u,d,f,p,h,m=[],g={};for(r=0;i>r;r++)if(p=f=e+12*r+2,s=n[a.SHORT(p)],s!==t){switch(u=a.SHORT(p+=2),d=a.LONG(p+=2),p+=4,m=[],u){case 1:case 7:for(d>4&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.BYTE(p+o);break;case 2:d>4&&(p=a.LONG(p)+c.tiffHeader),g[s]=a.STRING(p,d-1);continue;case 3:for(d>2&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.SHORT(p+2*o);break;case 4:for(d>1&&(p=a.LONG(p)+c.tiffHeader),o=0;d>o;o++)m[o]=a.LONG(p+4*o);break;case 5:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.LONG(p+4*o)/a.LONG(p+4*o+4);break;case 9:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.SLONG(p+4*o);break;case 10:for(p=a.LONG(p)+c.tiffHeader,o=0;d>o;o++)m[o]=a.SLONG(p+4*o)/a.SLONG(p+4*o+4);break;default:continue}h=1==d?m[0]:m,g[s]=l.hasOwnProperty(s)&&"object"!=typeof h?l[s][h]:h}return g}function r(){var e=c.tiffHeader;return a.II(18761==a.SHORT(e)),42!==a.SHORT(e+=2)?!1:(c.IFD0=c.tiffHeader+a.LONG(e+=2),u=i(c.IFD0,s.tiff),"ExifIFDPointer"in u&&(c.exifIFD=c.tiffHeader+u.ExifIFDPointer,delete u.ExifIFDPointer),"GPSInfoIFDPointer"in u&&(c.gpsIFD=c.tiffHeader+u.GPSInfoIFDPointer,delete u.GPSInfoIFDPointer),!0)}function o(e,t,n){var i,r,o,u=0;if("string"==typeof t){var l=s[e.toLowerCase()];for(var d in l)if(l[d]===t){t=d;break}}i=c[e.toLowerCase()+"IFD"],r=a.SHORT(i);for(var f=0;r>f;f++)if(o=i+12*f+2,a.SHORT(o)==t){u=o+8;break}return u?(a.LONG(u,n),!0):!1}var a,s,u,c={},l;return a=new n,s={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire.",1:"Flash fired.",5:"Strobe return light not detected.",7:"Strobe return light detected.",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},{init:function(e){return c={tiffHeader:10},e!==t&&e.length?(a.init(e),65505===a.SHORT(0)&&"EXIF\0"===a.STRING(4,5).toUpperCase()?r():!1):!1
-},TIFF:function(){return u},EXIF:function(){var t;if(t=i(c.exifIFD,s.exif),t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n=65472&&65475>=t)return e+=5,{height:c.SHORT(e),width:c.SHORT(e+=2)};n=c.SHORT(e+=2),e+=n-2}return null}function s(){d&&l&&c&&(d.purge(),l.purge(),c.init(null),u=f=l=d=c=null)}var u,c,l,d,f,p;if(u=o,c=new i,c.init(u),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new n(o),d=new r,p=!!d.init(l.get("app1")[0]),f=a.call(this),e.extend(this,{type:"image/jpeg",size:u.length,width:f&&f.width||0,height:f&&f.height||0,setExif:function(t,n){return p?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,n),l.set("app1",d.getBinary()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):u=l.restore(u)},stripHeaders:function(e){return l.strip(e)},purge:function(){s.call(this)}}),p&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS()})}return o}),i(z,[p,u,P],function(e,t,n){function i(i){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:u.LONG(t),height:u.LONG(t+=4)}):null}function o(){u&&(u.init(null),s=d=c=l=u=null)}function a(e){var t,n,i,r;return t=u.LONG(e),n=u.STRING(e+=4,4),i=e+=4,r=u.LONG(e+t),{length:t,type:n,start:i,CRC:r}}var s,u,c,l,d;s=i,u=new n,u.init(s),function(){var t=0,n=0,i=[35152,20039,3338,6666];for(n=0;ng;){for(var v=g+f>a?a-g:f,y=0;o>y;){var w=y+f>o?o-y:f;h.clearRect(0,0,f,f),h.drawImage(e,-y,-g);var E=y*s/o+c<<0,_=Math.ceil(w*s/o),x=g*u/a/m+l<<0,R=Math.ceil(v*u/a/m);d.drawImage(p,0,0,w,v,E,x,_,R),y+=f}g+=f}p=h=null}function t(e){var t=e.naturalWidth,n=e.naturalHeight;if(t*n>1048576){var i=document.createElement("canvas");i.width=i.height=1;var r=i.getContext("2d");return r.drawImage(e,-t+1,0),0===r.getImageData(0,0,1,1).data[3]}return!1}function n(e,t,n){var i=document.createElement("canvas");i.width=1,i.height=n;var r=i.getContext("2d");r.drawImage(e,0,0);for(var o=r.getImageData(0,0,1,n).data,a=0,s=n,u=n;u>a;){var c=o[4*(u-1)+3];0===c?s=u:a=u,u=s+a>>1}i=null;var l=u/n;return 0===l?1:l}return{isSubsampled:t,renderTo:e}}),i(X,[D,u,p,m,w,G,q,l,d],function(e,t,n,i,r,o,a,s,u){function c(){function e(){if(!E&&!y)throw new n.ImageError(n.DOMException.INVALID_STATE_ERR);return E||y}function c(e){return i.atob(e.substring(e.indexOf("base64,")+7))}function l(e,t){return"data:"+(t||"")+";base64,"+i.btoa(e)}function d(e){var t=this;y=new Image,y.onerror=function(){g.call(this),t.trigger("error",new n.ImageError(n.ImageError.WRONG_FORMAT))},y.onload=function(){t.trigger("load")},y.src=/^data:[^;]*;base64,/.test(e)?e:l(e,x.type)}function f(e,t){var i=this,r;return window.FileReader?(r=new FileReader,r.onload=function(){t(this.result)},r.onerror=function(){i.trigger("error",new n.FileException(n.FileException.NOT_READABLE_ERR))},r.readAsDataURL(e),void 0):t(e.getAsDataURL())}function p(n,i,r,o){var a=this,s,u,c=0,l=0,d,f,p,g;if(b=o,g=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1,-1!==t.inArray(g,[5,6,7,8])){var v=n;n=i,i=v}return d=e(),u=r?Math.max:Math.min,s=u(n/d.width,i/d.height),s>1&&(!r||o)?(this.trigger("Resize"),void 0):(E||(E=document.createElement("canvas")),f=Math.round(d.width*s),p=Math.round(d.height*s),r?(E.width=n,E.height=i,f>n&&(c=Math.round((f-n)/2)),p>i&&(l=Math.round((p-i)/2))):(E.width=f,E.height=p),b||m(E.width,E.height,g),h.call(this,d,E,-c,-l,f,p),this.width=E.width,this.height=E.height,R=!0,a.trigger("Resize"),void 0)}function h(e,t,n,i,r,o){if("iOS"===u.OS)a.renderTo(e,t,{width:r,height:o,x:n,y:i});else{var s=t.getContext("2d");s.drawImage(e,n,i,r,o)}}function m(e,t,n){switch(n){case 5:case 6:case 7:case 8:E.width=t,E.height=e;break;default:E.width=e,E.height=t}var i=E.getContext("2d");switch(n){case 2:i.translate(e,0),i.scale(-1,1);break;case 3:i.translate(e,t),i.rotate(Math.PI);break;case 4:i.translate(0,t),i.scale(1,-1);break;case 5:i.rotate(.5*Math.PI),i.scale(1,-1);break;case 6:i.rotate(.5*Math.PI),i.translate(0,-t);break;case 7:i.rotate(.5*Math.PI),i.translate(e,-t),i.scale(-1,1);break;case 8:i.rotate(-.5*Math.PI),i.translate(-e,0)}}function g(){w&&(w.purge(),w=null),_=y=E=x=null,R=!1}var v=this,y,w,E,_,x,R=!1,b=!0;t.extend(this,{loadFromBlob:function(e){var t=this,i=t.getRuntime(),r=arguments.length>1?arguments[1]:!0;if(!i.can("access_binary"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);return x=e,e.isDetached()?(_=e.getSource(),d.call(this,_),void 0):(f.call(this,e.getSource(),function(e){r&&(_=c(e)),d.call(t,e)}),void 0)},loadFromImage:function(e,t){this.meta=e.meta,x=new r(null,{name:e.name,size:e.size,type:e.type}),d.call(this,t?_=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t=this.getRuntime(),n;return!w&&_&&t.can("access_image_binary")&&(w=new o(_)),n={width:e().width||0,height:e().height||0,type:x.type||s.getFileMime(x.name),size:_&&_.length||x.size||0,name:x.name||"",meta:w&&w.meta||this.meta||{}}},downsize:function(){p.apply(this,arguments)},getAsCanvas:function(){return E&&(E.id=this.uid+"_canvas"),E},getAsBlob:function(e,t){return e!==this.type&&p.call(this,this.width,this.height,!1),new r(null,{name:x.name||"",type:e,data:v.getAsBinaryString.call(this,e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!R)return y.src;if("image/jpeg"!==e)return E.toDataURL("image/png");try{return E.toDataURL("image/jpeg",t/100)}catch(n){return E.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!R)return _||(_=c(v.getAsDataURL(e,t))),_;if("image/jpeg"!==e)_=c(v.getAsDataURL(e,t));else{var n;t||(t=90);try{n=E.toDataURL("image/jpeg",t/100)}catch(i){n=E.toDataURL("image/jpeg")}_=c(n),w&&(_=w.stripHeaders(_),b&&(w.meta&&w.meta.exif&&w.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),_=w.writeHeaders(_)),w.purge(),w=null)}return R=!1,_},destroy:function(){v=null,g.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=c}),i(j,[u,d,f,p,g],function(e,t,n,i,r){function o(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(n){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function a(a){var c=this,l;a=e.extend({swf_url:t.swf_url},a),r.call(this,a,s,{access_binary:function(e){return e&&"browser"===c.mode},access_image_binary:function(e){return e&&"browser"===c.mode},display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===c.mode},resize_image:r.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===c.mode},return_status_code:function(t){return"browser"===c.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:function(e){return e&&"browser"===c.mode},send_browser_cookies:function(e){return e&&"browser"===c.mode},send_custom_headers:function(e){return e&&"browser"===c.mode},send_multipart:r.capTrue,slice_blob:r.capTrue,stream_upload:function(e){return e&&"browser"===c.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===c.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),o()<10&&(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid)},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec(this.uid,e,t,n)},init:function(){var n,r,o;o=this.getShimContainer(),e.extend(o.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),n=' '+' '+' '+' '+" ","IE"===t.browser?(r=document.createElement("div"),o.appendChild(r),r.outerHTML=n,r=o=null):o.innerHTML=n,l=setTimeout(function(){c&&!c.initialized&&c.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){e.call(c),clearTimeout(l),a=l=e=c=null}}(this.destroy)},u)}var s="flash",u={};return r.addConstructor(s,a),u}),i(V,[j,y],function(e,t){var n={slice:function(e,n,i,r){var o=this.getRuntime();return 0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),e=o.shimExec.call(this,"Blob","slice",n,i,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=n}),i(W,[j],function(e){var t={init:function(e){this.getRuntime().shimExec.call(this,"FileInput","init",{name:e.name,accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=t}),i(Y,[j,m],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i="",r={read:function(e,t){var r=this,o=r.getRuntime();return"readAsDataURL"===e&&(i="data:"+(t.type||"")+";base64,"),r.bind("Progress",function(t,r){r&&(i+=n(r,e))}),o.shimExec.call(this,"FileReader","readAsBase64",t.uid)},getResult:function(){return i},destroy:function(){i=null}};return e.FileReader=r}),i($,[j,m],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i={read:function(e,t){var i,r=this.getRuntime();return(i=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(i="data:"+(t.type||"")+";base64,"+i),n(i,e,t.type)):null}};return e.FileReaderSync=i}),i(J,[j,u,y,w,T,S,O],function(e,t,n,i,r,o,a){var s={send:function(e,i){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,i)}function s(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),i=null,r()}function u(e,t){var n=new a;n.bind("TransportingComplete",function(){t(this.result)}),n.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),i instanceof o){var d;if(i.each(function(e,t){e instanceof n?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),i.hasBlob()){var f=i.getBlob();f.isDetached()?u(f,function(e){f.destroy(),s(d,e)}):s(d,f)}else i=null,r()}else i instanceof n?i.isDetached()?u(i,function(e){i.destroy(),i=e.uid,r()}):(i=i.uid,r()):r()},getResponse:function(e){var n,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new i(a.uid,o),"blob"===e)return o;try{if(n=new r,~t.inArray(e,["","text"]))return n.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(n.readAsText(o))}finally{o.destroy()}}return null},abort:function(e){var t=this.getRuntime();t.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=s}),i(Z,[j,y],function(e,t){var n={getAsBlob:function(e){var n=this.getRuntime(),i=n.shimExec.call(this,"Transporter","getAsBlob",e);return i?new t(n.uid,i):null}};return e.Transporter=n}),i(K,[j,u,O,y,T],function(e,t,n,i,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(i,"Image","loadFromBlob",e.uid),i=r=null}var i=this,r=i.getRuntime();if(e.isDetached()){var o=new n;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getAsBlob:function(e,t){var n=this.getRuntime(),r=n.shimExec.call(this,"Image","getAsBlob",e,t);return r?new i(n.uid,r):null},getAsDataURL:function(){var e=this.getRuntime(),t=e.Image.getAsBlob.apply(this,arguments),n;return t?(n=new r,n.readAsDataURL(t)):null}};return e.Image=o}),i(Q,[u,d,f,p,g],function(e,t,n,i,r){function o(e){var t=!1,n=null,i,r,o,a,s,u=0;try{try{n=new ActiveXObject("AgControl.AgControl"),n.IsVersionSupported(e)&&(t=!0),n=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(i=l.description,"1.0.30226.2"===i&&(i="2.0.30226.2"),r=i.split(".");r.length>3;)r.pop();for(;r.length<4;)r.push(0);for(o=e.split(".");o.length>4;)o.pop();do a=parseInt(o[u],10),s=parseInt(r[u],10),u++;while(u=a&&!isNaN(a)&&(t=!0)}}}catch(d){t=!1}return t}function a(a){var c=this,l;a=e.extend({xap_url:t.xap_url},a),r.call(this,a,s,{access_binary:r.capTrue,access_image_binary:r.capTrue,display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:r.capTrue,resize_image:r.capTrue,return_response_headers:function(e){return e&&"client"===c.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===c.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:r.capTrue,send_browser_cookies:function(e){return e&&"browser"===c.mode},send_custom_headers:function(e){return e&&"client"===c.mode},send_multipart:r.capTrue,slice_blob:r.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:r.capTrue,use_http_method:function(t){return"client"===c.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),o("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid).content.Moxie},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec(this.uid,e,t,n)},init:function(){var e;e=this.getShimContainer(),e.innerHTML=''+' '+' '+' '+' '+' '+" ",l=setTimeout(function(){c&&!c.initialized&&c.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(c),clearTimeout(l),a=l=e=c=null}}(this.destroy)},u)}var s="silverlight",u={};return r.addConstructor(s,a),u}),i(et,[Q,u,V],function(e,t,n){return e.Blob=t.extend({},n)}),i(tt,[Q],function(e){var t={init:function(e){function t(e){for(var t="",n=0;no;o++)n=t.keys[o],s=t[n],s&&(/^(\d|[1-9]\d+)$/.test(s)?s=parseInt(s,10):/^\d*\.\d+$/.test(s)&&(s=parseFloat(s)),i.meta[e][n]=s)}),i.width=parseInt(r.width,10),i.height=parseInt(r.height,10),i.size=parseInt(r.size,10),i.type=r.type,i.name=r.name,i}})}),i(ut,[u,p,g,d],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue;n.call(this,t,o,{access_binary:s(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:s(a.Image&&(i.can("create_canvas")||i.can("use_data_uri_over32kb"))),do_cors:!1,drag_and_drop:!1,filter_by_extension:s(function(){return"Chrome"===i.browser&&i.version>=28||"IE"===i.browser&&i.version>=10}()),resize_image:function(){return a.Image&&r.can("access_binary")&&i.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return i.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return r.can("select_file")},summon_file_dialog:s(function(){return"Firefox"===i.browser&&i.version>=4||"Opera"===i.browser&&i.version>=12||!!~e.inArray(i.browser,["Chrome","Safari"])}()),upload_filesize:u,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html4",a={};return n.addConstructor(o,r),a}),i(ct,[ut,u,f,L,l,d],function(e,t,n,i,r,o){function a(){function e(){var r=this,l=r.getRuntime(),d,f,p,h,m,g;g=t.guid("uid_"),d=l.getShimContainer(),a&&(p=n.get(a+"_form"),p&&t.extend(p.style,{top:"100%"})),h=document.createElement("form"),h.setAttribute("id",g+"_form"),h.setAttribute("method","post"),h.setAttribute("enctype","multipart/form-data"),h.setAttribute("encoding","multipart/form-data"),t.extend(h.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=document.createElement("input"),m.setAttribute("id",g),m.setAttribute("type","file"),m.setAttribute("name",c.name||"Filedata"),m.setAttribute("accept",u.join(",")),t.extend(m.style,{fontSize:"999px",opacity:0}),h.appendChild(m),d.appendChild(h),t.extend(m.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===o.browser&&o.version<10&&t.extend(m.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),m.onchange=function(){var t;this.value&&(t=this.files?this.files[0]:{name:this.value},s=[t],this.onchange=function(){},e.call(r),r.bind("change",function i(){var e=n.get(g),t=n.get(g+"_form"),o;r.unbind("change",i),r.files.length&&e&&t&&(o=r.files[0],e.setAttribute("id",o.uid),t.setAttribute("id",o.uid+"_form"),t.setAttribute("target",o.uid+"_iframe")),e=t=null},998),m=h=null,r.trigger("change"))},l.can("summon_file_dialog")&&(f=n.get(c.browse_button),i.removeEvent(f,"click",r.uid),i.addEvent(f,"click",function(e){m&&!m.disabled&&m.click(),e.preventDefault()},r.uid)),a=g,d=p=f=null}var a,s=[],u=[],c;t.extend(this,{init:function(t){var o=this,a=o.getRuntime(),s;c=t,u=t.accept.mimes||r.extList2mimes(t.accept,a.can("filter_by_extension")),s=a.getShimContainer(),function(){var e,r,u;e=n.get(t.browse_button),a.can("summon_file_dialog")&&("static"===n.getStyle(e,"position")&&(e.style.position="relative"),r=parseInt(n.getStyle(e,"z-index"),10)||1,e.style.zIndex=r,s.style.zIndex=r-1),u=a.can("summon_file_dialog")?e:s,i.addEvent(u,"mouseover",function(){o.trigger("mouseenter")},o.uid),i.addEvent(u,"mouseout",function(){o.trigger("mouseleave")},o.uid),i.addEvent(u,"mousedown",function(){o.trigger("mousedown")},o.uid),i.addEvent(n.get(t.container),"mouseup",function(){o.trigger("mouseup")},o.uid),e=null}(),e.call(this),s=null,o.trigger({type:"ready",async:!0})},getFiles:function(){return s},disable:function(e){var t;(t=n.get(a))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),r=e.getShimContainer();i.removeAllEvents(r,this.uid),i.removeAllEvents(c&&n.get(c.container),this.uid),i.removeAllEvents(c&&n.get(c.browse_button),this.uid),r&&(r.innerHTML=""),t.removeInstance(this.uid),a=s=u=c=r=t=null}})}return e.FileInput=a}),i(lt,[ut,F],function(e,t){return e.FileReader=t}),i(dt,[ut,u,f,b,p,L,y,S],function(e,t,n,i,r,o,a,s){function u(){function e(e){var t=this,i,r,a,s,u=!1;if(l){if(i=l.id.replace(/_iframe$/,""),r=n.get(i+"_form")){for(a=r.getElementsByTagName("input"),s=a.length;s--;)switch(a[s].getAttribute("type")){case"hidden":a[s].parentNode.removeChild(a[s]);break;case"file":u=!0}a=[],u||r.parentNode.removeChild(r),r=null}setTimeout(function(){o.removeEvent(l,"load",t.uid),l.parentNode&&l.parentNode.removeChild(l);var n=t.getRuntime().getShimContainer();n.children.length||n.parentNode.removeChild(n),n=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,f){function p(){var n=m.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='',l=r.firstChild,n.appendChild(l),o.addEvent(l,"load",function(){var n;try{n=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(n.title)?u=n.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(n.body.innerHTML),h.trigger({type:"progress",loaded:c.length,total:c.length}),w&&h.trigger({type:"uploadprogress",loaded:w.size||1025,total:w.size||1025}))}catch(r){if(!i.hasSameOrigin(d.url))return e.call(h,function(){h.trigger("error")}),void 0;u=404}e.call(h,function(){h.trigger("load")})},h.uid)}var h=this,m=h.getRuntime(),g,v,y,w;if(u=c=null,f instanceof s&&f.hasBlob()){if(w=f.getBlob(),g=w.uid,y=n.get(g),v=n.get(g+"_form"),!v)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else g=t.guid("uid_"),v=document.createElement("form"),v.setAttribute("id",g+"_form"),v.setAttribute("method",d.method),v.setAttribute("enctype","multipart/form-data"),v.setAttribute("encoding","multipart/form-data"),v.setAttribute("target",g+"_iframe"),m.getShimContainer().appendChild(v);f instanceof s&&f.each(function(e,n){if(e instanceof a)y&&y.setAttribute("name",n);else{var i=document.createElement("input");t.extend(i,{type:"hidden",name:n,value:e}),y?v.insertBefore(i,y):v.appendChild(i)}}),v.setAttribute("action",d.url),p(),v.submit(),h.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*]*>/,"").replace(/<\/pre>\s*$/,""))}catch(n){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})}})}return e.XMLHttpRequest=u}),i(ft,[ut,X],function(e,t){return e.Image=t}),a([u,c,l,d,f,p,h,m,g,v,y,w,E,_,x,R,b,T,S,A,O,I,L])}(this);;(function(){"use strict";var e={},t=moxie.core.utils.Basic.inArray;return function n(r){var i,s;for(i in r)s=typeof r[i],s==="object"&&!~t(i,["Exceptions","Env","Mime"])?n(r[i]):s==="function"&&(e[i]=r[i])}(window.moxie),e.Env=window.moxie.core.utils.Env,e.Mime=window.moxie.core.utils.Mime,e.Exceptions=window.moxie.core.Exceptions,window.mOxie=e,window.o||(window.o=e),e})();
-/**
- * Plupload - multi-runtime File Uploader
- * v2.1.1
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-;(function(e,t,n){function s(e){function r(e,t,r){var i={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};i[e]?n[i[e]]=t:r||(n[e]=t)}var t=e.required_features,n={};return typeof t=="string"?o.each(t.split(/\s*,\s*/),function(e){r(e,!0)}):typeof t=="object"?o.each(t,function(e,t){r(t,e)}):t===!0&&(e.multipart||(n.send_binary_string=!0),e.chunk_size>0&&(n.slice_blob=!0),e.resize.enabled&&(n.send_binary_string=!0),o.each(e,function(e,t){r(t,!!e,!0)})),n}var r=e.setTimeout,i={},o={VERSION:"2.1.1",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,IMAGE_MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,mimeTypes:t.mimes,ua:t.ua,typeOf:t.typeOf,extend:t.extend,guid:t.guid,get:function(n){var r=[],i;t.typeOf(n)!=="array"&&(n=[n]);var s=n.length;while(s--)i=t.get(n[s]),i&&r.push(i);return r.length?r:null},each:t.each,getPos:t.getPos,getSize:t.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},n=/[<>&\"\']/g;return e?(""+e).replace(n,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:t.toArray,inArray:t.inArray,addI18n:t.addI18n,translate:t.translate,isEmptyObj:t.isEmptyObj,hasClass:t.hasClass,addClass:t.addClass,removeClass:t.removeClass,getStyle:t.getStyle,addEvent:t.addEvent,removeEvent:t.removeEvent,removeAllEvents:t.removeAllEvents,cleanName:function(e){var t,n;n=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(t=0;t0?"&":"?")+n),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===n||/\D/.test(e))return o.translate("N/A");var r=Math.pow(1024,4);return e>r?t(e/r,1)+" "+o.translate("tb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("gb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("mb"):e>1024?Math.round(e/1024)+" "+o.translate("kb"):e+" "+o.translate("b")},parseSize:t.parseSizeStr,predictRuntime:function(e,n){var r,i;return r=new o.Uploader(e),i=t.Runtime.thatCan(r.getOption().required_features,n||e.runtimes),r.destroy(),i},addFileFilter:function(e,t){i[e]=t}};o.addFileFilter("mime_types",function(e,t,n){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:o.FILE_EXTENSION_ERROR,message:o.translate("File extension error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("max_file_size",function(e,t,n){var r;e=o.parseSize(e),t.size!==r&&e&&t.size>e?(this.trigger("Error",{code:o.FILE_SIZE_ERROR,message:o.translate("File size error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("prevent_duplicates",function(e,t,n){if(e){var r=this.files.length;while(r--)if(t.name===this.files[r].name&&t.size===this.files[r].size){this.trigger("Error",{code:o.FILE_DUPLICATE_ERROR,message:o.translate("Duplicate file error."),file:t}),n(!1);return}}n(!0)}),o.Uploader=function(e){function g(){var e,t=0,n;if(this.state==o.STARTED){for(n=0;n0?Math.ceil(e.loaded/e.size*100):100,b()}function b(){var e,t;d.reset();for(e=0;e0?Math.ceil(d.uploaded/f.length*100):0:(d.bytesPerSec=Math.ceil(d.loaded/((+(new Date)-p||1)/1e3)),d.percent=d.size>0?Math.ceil(d.loaded/d.size*100):0)}function w(){var e=c[0]||h[0];return e?e.getRuntime().uid:!1}function E(e,n){if(e.ruid){var r=t.Runtime.getInfo(e.ruid);if(r)return r.can(n)}return!1}function S(){this.bind("FilesAdded",C),this.bind("CancelUpload",M),this.bind("BeforeUpload",k),this.bind("UploadFile",L),this.bind("UploadProgress",A),this.bind("StateChanged",O),this.bind("QueueChanged",b),this.bind("Error",D),this.bind("FileUploaded",_),this.bind("Destroy",P)}function x(e,n){var r=this,i=0,s=[],u={accept:e.filters.mime_types,runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:l,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};o.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(u[t]=e[t])}),e.browse_button&&o.each(e.browse_button,function(n){s.push(function(s){var a=new t.FileInput(o.extend({},u,{name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:n}));a.onready=function(){var e=t.Runtime.getInfo(this.ruid);t.extend(r.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),i++,c.push(this),s()},a.onchange=function(){r.addFile(this.files)},a.bind("mouseenter mouseleave mousedown mouseup",function(r){v||(e.browse_button_hover&&("mouseenter"===r.type?t.addClass(n,e.browse_button_hover):"mouseleave"===r.type&&t.removeClass(n,e.browse_button_hover)),e.browse_button_active&&("mousedown"===r.type?t.addClass(n,e.browse_button_active):"mouseup"===r.type&&t.removeClass(n,e.browse_button_active)))}),a.bind("error runtimeerror",function(){a=null,s()}),a.init()})}),e.drop_element&&o.each(e.drop_element,function(e){s.push(function(n){var s=new t.FileDrop(o.extend({},u,{drop_zone:e}));s.onready=function(){var e=t.Runtime.getInfo(this.ruid);r.features.dragdrop=e.can("drag_and_drop"),i++,h.push(this),n()},s.ondrop=function(){r.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,n()}),s.init()})}),t.inSeries(s,function(){typeof n=="function"&&n(i)})}function T(e,n,r){var i=new t.Image;try{i.onload=function(){i.downsize(n.width,n.height,n.crop,n.preserve_headers)},i.onresize=function(){r(this.getAsBlob(e.type,n.quality)),this.destroy()},i.onerror=function(){r(e)},i.load(e)}catch(s){r(e)}}function N(e,n,r){function f(e,t,n){var r=a[e];switch(e){case"max_file_size":e==="max_file_size"&&(a.max_file_size=a.filters.max_file_size=t);break;case"chunk_size":if(t=o.parseSize(t))a[e]=t;break;case"filters":o.typeOf(t)==="array"&&(t={mime_types:t}),n?o.extend(a.filters,t):a.filters=t,t.mime_types&&(a.filters.mime_types.regexp=function(e){var t=[];return o.each(e,function(e){o.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(a.filters.mime_types));break;case"resize":n?o.extend(a.resize,t,{enabled:!0}):a.resize=t;break;case"prevent_duplicates":a.prevent_duplicates=a.filters.prevent_duplicates=!!t;break;case"browse_button":case"drop_element":t=o.get(t);case"container":case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":a[e]=t,n||(u=!0);break;default:a[e]=t}n||i.trigger("OptionChanged",e,t,r)}var i=this,u=!1;typeof e=="object"?o.each(e,function(e,t){f(t,e,r)}):f(e,n,r),r?(a.required_features=s(o.extend({},a)),l=s(o.extend({},a,{required_features:!0}))):u&&(i.trigger("Destroy"),x.call(i,a,function(e){e?(i.runtime=t.Runtime.getInfo(w()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})}))}function C(e,t){[].push.apply(f,t),e.trigger("QueueChanged"),e.refresh()}function k(e,t){if(a.unique_names){var n=t.name.match(/\.([^.]+)$/),r="part";n&&(r=n[1]),t.target_name=t.id+"."+r}}function L(e,n){function h(){u-->0?r(p,1e3):(n.loaded=f,e.trigger("Error",{code:o.HTTP_ERROR,message:o.translate("HTTP Error."),file:n,response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()}))}function p(){var d,v,g,y;if(n.status==o.DONE||n.status==o.FAILED||e.state==o.STOPPED)return;g={name:n.target_name||n.name},s&&a.chunks&&c.size>s?(y=Math.min(s,c.size-f),d=c.slice(f,f+y)):(y=c.size,d=c),s&&a.chunks&&(e.settings.send_chunk_number?(g.chunk=Math.ceil(f/s),g.chunks=Math.ceil(c.size/s)):(g.offset=f,g.total=c.size)),m=new t.XMLHttpRequest,m.upload&&(m.upload.onprogress=function(t){n.loaded=Math.min(n.size,f+t.loaded),e.trigger("UploadProgress",n)}),m.onload=function(){if(m.status>=400){h();return}u=e.settings.max_retries,y=c.size?(n.size!=n.origSize&&(c.destroy(),c=null),e.trigger("UploadProgress",n),n.status=o.DONE,e.trigger("FileUploaded",n,{response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()})):r(p,1)},m.onerror=function(){h()},m.onloadend=function(){this.destroy(),m=null},e.settings.multipart&&a.multipart?(g.name=n.target_name||n.name,m.open("post",i,!0),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),v=new t.FormData,o.each(o.extend(g,e.settings.multipart_params),function(e,t){v.append(t,e)}),v.append(e.settings.file_data_name,d),m.send(v,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url})):(i=o.buildUrl(e.settings.url,o.extend(g,e.settings.multipart_params)),m.open("post",i,!0),m.setRequestHeader("Content-Type","application/octet-stream"),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),m.send(d,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url}))}var i=e.settings.url,s=e.settings.chunk_size,u=e.settings.max_retries,a=e.features,f=0,c;n.loaded&&(f=n.loaded=s*Math.floor(n.loaded/s)),c=n.getSource(),e.settings.resize.enabled&&E(c,"send_binary_string")&&!!~t.inArray(c.type,["image/jpeg","image/png"])?T.call(this,c,e.settings.resize,function(e){c=e,n.size=e.size,p()}):p()}function A(e,t){y(t)}function O(e){if(e.state==o.STARTED)p=+(new Date);else if(e.state==o.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==o.UPLOADING&&(e.files[t].status=o.QUEUED,b())}function M(){m&&m.abort()}function _(e){b(),r(function(){g.call(e)},1)}function D(e,t){t.file&&(t.file.status=o.FAILED,y(t.file),e.state==o.STARTED&&(e.trigger("CancelUpload"),r(function(){g.call(e)},1)))}function P(e){e.stop(),o.each(f,function(e){e.destroy()}),f=[],c.length&&(o.each(c,function(e){e.destroy()}),c=[]),h.length&&(o.each(h,function(e){e.destroy()}),h=[]),l={},v=!1,p=m=null,d.reset()}var u=o.guid(),a,f=[],l={},c=[],h=[],p,d,v=!1,m;a={runtimes:t.Runtime.order,max_retries:0,chunk_size:0,multipart:!0,multi_selection:!0,file_data_name:"file",flash_swf_url:"js/Moxie.swf",silverlight_xap_url:"js/Moxie.xap",filters:{mime_types:[],prevent_duplicates:!1,max_file_size:0},resize:{enabled:!1,preserve_headers:!0,crop:!1},send_chunk_number:!0},N.call(this,e,null,!0),d=new o.QueueProgress,o.extend(this,{id:u,uid:u,state:o.STOPPED,features:{},runtime:null,files:f,settings:a,total:d,init:function(){var e=this;typeof a.preinit=="function"?a.preinit(e):o.each(a.preinit,function(t,n){e.bind(n,t)});if(!a.browse_button||!a.url){this.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")});return}S.call(this),x.call(this,a,function(n){typeof a.init=="function"?a.init(e):o.each(a.init,function(t,n){e.bind(n,t)}),n?(e.runtime=t.Runtime.getInfo(w()).type,e.trigger("Init",{runtime:e.runtime}),e.trigger("PostInit")):e.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})})},setOption:function(e,t){N.call(this,e,t,!this.runtime)},getOption:function(e){return e?a[e]:a},refresh:function(){c.length&&o.each(c,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=o.STARTED&&(this.state=o.STARTED,this.trigger("StateChanged"),g.call(this))},stop:function(){this.state!=o.STOPPED&&(this.state=o.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){v=arguments[0]!==n?arguments[0]:!0,c.length&&o.each(c,function(e){e.disable(v)}),this.trigger("DisableBrowse",v)},getFile:function(e){var t;for(t=f.length-1;t>=0;t--)if(f[t].id===e)return f[t]},addFile:function(e,n){function l(e,n){var r=[];t.each(s.settings.filters,function(t,n){i[n]&&r.push(function(r){i[n].call(s,t,e,function(e){r(!e)})})}),t.inSeries(r,n)}function c(e){var i=t.typeOf(e);if(e instanceof t.File){if(!e.ruid&&!e.isDetached()){if(!f)return!1;e.ruid=f,e.connectRuntime(f)}c(new o.File(e))}else e instanceof t.Blob?(c(e.getSource()),e.destroy()):e instanceof o.File?(n&&(e.name=n),u.push(function(t){l(e,function(n){n||(a.push(e),s.trigger("FileFiltered",e)),r(t,1)})})):t.inArray(i,["file","blob"])!==-1?c(new t.File(null,e)):i==="node"&&t.typeOf(e.files)==="filelist"?t.each(e.files,c):i==="array"&&(n=null,t.each(e,c))}var s=this,u=[],a=[],f;f=w(),c(e),u.length&&t.inSeries(u,function(){a.length&&s.trigger("FilesAdded",a)})},removeFile:function(e){var t=typeof e=="string"?e:e.id;for(var n=f.length-1;n>=0;n--)if(f[n].id===t)return this.splice(n,1)[0]},splice:function(e,t){var r=f.splice(e===n?0:e,t===n?f.length:t),i=!1;return this.state==o.STARTED&&(i=!0,this.stop()),this.trigger("FilesRemoved",r),o.each(r,function(e){e.destroy()}),this.trigger("QueueChanged"),this.refresh(),i&&this.start(),r},bind:function(e,t,n){var r=this;o.Uploader.prototype.bind.call(this,e,function(){var e=[].slice.call(arguments);return e.splice(0,1,r),t.apply(this,e)},0,n)},destroy:function(){this.trigger("Destroy"),a=d=null,this.unbindAll()}})},o.Uploader.prototype=t.EventTarget.instance,o.File=function(){function n(n){o.extend(this,{id:o.guid(),name:n.name||n.fileName,type:n.type||"",size:n.size||n.fileSize,origSize:n.size||n.fileSize,loaded:0,percent:0,status:o.QUEUED,lastModifiedDate:n.lastModifiedDate||(new Date).toLocaleString(),getNative:function(){var e=this.getSource().getSource();return t.inArray(t.typeOf(e),["blob","file"])!==-1?e:null},getSource:function(){return e[this.id]?e[this.id]:null},destroy:function(){var t=this.getSource();t&&(t.destroy(),delete e[this.id])}}),e[this.id]=n}var e={};return n}(),o.QueueProgress=function(){var e=this;e.size=0,e.loaded=0,e.uploaded=0,e.failed=0,e.queued=0,e.percent=0,e.bytesPerSec=0,e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}},e.plupload=o})(window,mOxie);
\ No newline at end of file
diff --git a/demo/js/plupload/plupload.min.js b/demo/js/plupload/plupload.min.js
deleted file mode 100644
index 06bcd595..00000000
--- a/demo/js/plupload/plupload.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Plupload - multi-runtime File Uploader
- * v2.1.1
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2014-01-16
- */
-;(function(e,t,n){function s(e){function r(e,t,r){var i={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};i[e]?n[i[e]]=t:r||(n[e]=t)}var t=e.required_features,n={};return typeof t=="string"?o.each(t.split(/\s*,\s*/),function(e){r(e,!0)}):typeof t=="object"?o.each(t,function(e,t){r(t,e)}):t===!0&&(e.multipart||(n.send_binary_string=!0),e.chunk_size>0&&(n.slice_blob=!0),e.resize.enabled&&(n.send_binary_string=!0),o.each(e,function(e,t){r(t,!!e,!0)})),n}var r=e.setTimeout,i={},o={VERSION:"2.1.1",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,IMAGE_MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,mimeTypes:t.mimes,ua:t.ua,typeOf:t.typeOf,extend:t.extend,guid:t.guid,get:function(n){var r=[],i;t.typeOf(n)!=="array"&&(n=[n]);var s=n.length;while(s--)i=t.get(n[s]),i&&r.push(i);return r.length?r:null},each:t.each,getPos:t.getPos,getSize:t.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},n=/[<>&\"\']/g;return e?(""+e).replace(n,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:t.toArray,inArray:t.inArray,addI18n:t.addI18n,translate:t.translate,isEmptyObj:t.isEmptyObj,hasClass:t.hasClass,addClass:t.addClass,removeClass:t.removeClass,getStyle:t.getStyle,addEvent:t.addEvent,removeEvent:t.removeEvent,removeAllEvents:t.removeAllEvents,cleanName:function(e){var t,n;n=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(t=0;t0?"&":"?")+n),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===n||/\D/.test(e))return o.translate("N/A");var r=Math.pow(1024,4);return e>r?t(e/r,1)+" "+o.translate("tb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("gb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("mb"):e>1024?Math.round(e/1024)+" "+o.translate("kb"):e+" "+o.translate("b")},parseSize:t.parseSizeStr,predictRuntime:function(e,n){var r,i;return r=new o.Uploader(e),i=t.Runtime.thatCan(r.getOption().required_features,n||e.runtimes),r.destroy(),i},addFileFilter:function(e,t){i[e]=t}};o.addFileFilter("mime_types",function(e,t,n){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:o.FILE_EXTENSION_ERROR,message:o.translate("File extension error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("max_file_size",function(e,t,n){var r;e=o.parseSize(e),t.size!==r&&e&&t.size>e?(this.trigger("Error",{code:o.FILE_SIZE_ERROR,message:o.translate("File size error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("prevent_duplicates",function(e,t,n){if(e){var r=this.files.length;while(r--)if(t.name===this.files[r].name&&t.size===this.files[r].size){this.trigger("Error",{code:o.FILE_DUPLICATE_ERROR,message:o.translate("Duplicate file error."),file:t}),n(!1);return}}n(!0)}),o.Uploader=function(e){function g(){var e,t=0,n;if(this.state==o.STARTED){for(n=0;n0?Math.ceil(e.loaded/e.size*100):100,b()}function b(){var e,t;d.reset();for(e=0;e0?Math.ceil(d.uploaded/f.length*100):0:(d.bytesPerSec=Math.ceil(d.loaded/((+(new Date)-p||1)/1e3)),d.percent=d.size>0?Math.ceil(d.loaded/d.size*100):0)}function w(){var e=c[0]||h[0];return e?e.getRuntime().uid:!1}function E(e,n){if(e.ruid){var r=t.Runtime.getInfo(e.ruid);if(r)return r.can(n)}return!1}function S(){this.bind("FilesAdded",C),this.bind("CancelUpload",M),this.bind("BeforeUpload",k),this.bind("UploadFile",L),this.bind("UploadProgress",A),this.bind("StateChanged",O),this.bind("QueueChanged",b),this.bind("Error",D),this.bind("FileUploaded",_),this.bind("Destroy",P)}function x(e,n){var r=this,i=0,s=[],u={accept:e.filters.mime_types,runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:l,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};o.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(u[t]=e[t])}),e.browse_button&&o.each(e.browse_button,function(n){s.push(function(s){var a=new t.FileInput(o.extend({},u,{name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:n}));a.onready=function(){var e=t.Runtime.getInfo(this.ruid);t.extend(r.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),i++,c.push(this),s()},a.onchange=function(){r.addFile(this.files)},a.bind("mouseenter mouseleave mousedown mouseup",function(r){v||(e.browse_button_hover&&("mouseenter"===r.type?t.addClass(n,e.browse_button_hover):"mouseleave"===r.type&&t.removeClass(n,e.browse_button_hover)),e.browse_button_active&&("mousedown"===r.type?t.addClass(n,e.browse_button_active):"mouseup"===r.type&&t.removeClass(n,e.browse_button_active)))}),a.bind("error runtimeerror",function(){a=null,s()}),a.init()})}),e.drop_element&&o.each(e.drop_element,function(e){s.push(function(n){var s=new t.FileDrop(o.extend({},u,{drop_zone:e}));s.onready=function(){var e=t.Runtime.getInfo(this.ruid);r.features.dragdrop=e.can("drag_and_drop"),i++,h.push(this),n()},s.ondrop=function(){r.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,n()}),s.init()})}),t.inSeries(s,function(){typeof n=="function"&&n(i)})}function T(e,n,r){var i=new t.Image;try{i.onload=function(){i.downsize(n.width,n.height,n.crop,n.preserve_headers)},i.onresize=function(){r(this.getAsBlob(e.type,n.quality)),this.destroy()},i.onerror=function(){r(e)},i.load(e)}catch(s){r(e)}}function N(e,n,r){function f(e,t,n){var r=a[e];switch(e){case"max_file_size":e==="max_file_size"&&(a.max_file_size=a.filters.max_file_size=t);break;case"chunk_size":if(t=o.parseSize(t))a[e]=t;break;case"filters":o.typeOf(t)==="array"&&(t={mime_types:t}),n?o.extend(a.filters,t):a.filters=t,t.mime_types&&(a.filters.mime_types.regexp=function(e){var t=[];return o.each(e,function(e){o.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(a.filters.mime_types));break;case"resize":n?o.extend(a.resize,t,{enabled:!0}):a.resize=t;break;case"prevent_duplicates":a.prevent_duplicates=a.filters.prevent_duplicates=!!t;break;case"browse_button":case"drop_element":t=o.get(t);case"container":case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":a[e]=t,n||(u=!0);break;default:a[e]=t}n||i.trigger("OptionChanged",e,t,r)}var i=this,u=!1;typeof e=="object"?o.each(e,function(e,t){f(t,e,r)}):f(e,n,r),r?(a.required_features=s(o.extend({},a)),l=s(o.extend({},a,{required_features:!0}))):u&&(i.trigger("Destroy"),x.call(i,a,function(e){e?(i.runtime=t.Runtime.getInfo(w()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})}))}function C(e,t){[].push.apply(f,t),e.trigger("QueueChanged"),e.refresh()}function k(e,t){if(a.unique_names){var n=t.name.match(/\.([^.]+)$/),r="part";n&&(r=n[1]),t.target_name=t.id+"."+r}}function L(e,n){function h(){u-->0?r(p,1e3):(n.loaded=f,e.trigger("Error",{code:o.HTTP_ERROR,message:o.translate("HTTP Error."),file:n,response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()}))}function p(){var d,v,g,y;if(n.status==o.DONE||n.status==o.FAILED||e.state==o.STOPPED)return;g={name:n.target_name||n.name},s&&a.chunks&&c.size>s?(y=Math.min(s,c.size-f),d=c.slice(f,f+y)):(y=c.size,d=c),s&&a.chunks&&(e.settings.send_chunk_number?(g.chunk=Math.ceil(f/s),g.chunks=Math.ceil(c.size/s)):(g.offset=f,g.total=c.size)),m=new t.XMLHttpRequest,m.upload&&(m.upload.onprogress=function(t){n.loaded=Math.min(n.size,f+t.loaded),e.trigger("UploadProgress",n)}),m.onload=function(){if(m.status>=400){h();return}u=e.settings.max_retries,y=c.size?(n.size!=n.origSize&&(c.destroy(),c=null),e.trigger("UploadProgress",n),n.status=o.DONE,e.trigger("FileUploaded",n,{response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()})):r(p,1)},m.onerror=function(){h()},m.onloadend=function(){this.destroy(),m=null},e.settings.multipart&&a.multipart?(g.name=n.target_name||n.name,m.open("post",i,!0),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),v=new t.FormData,o.each(o.extend(g,e.settings.multipart_params),function(e,t){v.append(t,e)}),v.append(e.settings.file_data_name,d),m.send(v,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url})):(i=o.buildUrl(e.settings.url,o.extend(g,e.settings.multipart_params)),m.open("post",i,!0),m.setRequestHeader("Content-Type","application/octet-stream"),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),m.send(d,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url}))}var i=e.settings.url,s=e.settings.chunk_size,u=e.settings.max_retries,a=e.features,f=0,c;n.loaded&&(f=n.loaded=s*Math.floor(n.loaded/s)),c=n.getSource(),e.settings.resize.enabled&&E(c,"send_binary_string")&&!!~t.inArray(c.type,["image/jpeg","image/png"])?T.call(this,c,e.settings.resize,function(e){c=e,n.size=e.size,p()}):p()}function A(e,t){y(t)}function O(e){if(e.state==o.STARTED)p=+(new Date);else if(e.state==o.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==o.UPLOADING&&(e.files[t].status=o.QUEUED,b())}function M(){m&&m.abort()}function _(e){b(),r(function(){g.call(e)},1)}function D(e,t){t.file&&(t.file.status=o.FAILED,y(t.file),e.state==o.STARTED&&(e.trigger("CancelUpload"),r(function(){g.call(e)},1)))}function P(e){e.stop(),o.each(f,function(e){e.destroy()}),f=[],c.length&&(o.each(c,function(e){e.destroy()}),c=[]),h.length&&(o.each(h,function(e){e.destroy()}),h=[]),l={},v=!1,p=m=null,d.reset()}var u=o.guid(),a,f=[],l={},c=[],h=[],p,d,v=!1,m;a={runtimes:t.Runtime.order,max_retries:0,chunk_size:0,multipart:!0,multi_selection:!0,file_data_name:"file",flash_swf_url:"js/Moxie.swf",silverlight_xap_url:"js/Moxie.xap",filters:{mime_types:[],prevent_duplicates:!1,max_file_size:0},resize:{enabled:!1,preserve_headers:!0,crop:!1},send_chunk_number:!0},N.call(this,e,null,!0),d=new o.QueueProgress,o.extend(this,{id:u,uid:u,state:o.STOPPED,features:{},runtime:null,files:f,settings:a,total:d,init:function(){var e=this;typeof a.preinit=="function"?a.preinit(e):o.each(a.preinit,function(t,n){e.bind(n,t)});if(!a.browse_button||!a.url){this.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")});return}S.call(this),x.call(this,a,function(n){typeof a.init=="function"?a.init(e):o.each(a.init,function(t,n){e.bind(n,t)}),n?(e.runtime=t.Runtime.getInfo(w()).type,e.trigger("Init",{runtime:e.runtime}),e.trigger("PostInit")):e.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})})},setOption:function(e,t){N.call(this,e,t,!this.runtime)},getOption:function(e){return e?a[e]:a},refresh:function(){c.length&&o.each(c,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=o.STARTED&&(this.state=o.STARTED,this.trigger("StateChanged"),g.call(this))},stop:function(){this.state!=o.STOPPED&&(this.state=o.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){v=arguments[0]!==n?arguments[0]:!0,c.length&&o.each(c,function(e){e.disable(v)}),this.trigger("DisableBrowse",v)},getFile:function(e){var t;for(t=f.length-1;t>=0;t--)if(f[t].id===e)return f[t]},addFile:function(e,n){function l(e,n){var r=[];t.each(s.settings.filters,function(t,n){i[n]&&r.push(function(r){i[n].call(s,t,e,function(e){r(!e)})})}),t.inSeries(r,n)}function c(e){var i=t.typeOf(e);if(e instanceof t.File){if(!e.ruid&&!e.isDetached()){if(!f)return!1;e.ruid=f,e.connectRuntime(f)}c(new o.File(e))}else e instanceof t.Blob?(c(e.getSource()),e.destroy()):e instanceof o.File?(n&&(e.name=n),u.push(function(t){l(e,function(n){n||(a.push(e),s.trigger("FileFiltered",e)),r(t,1)})})):t.inArray(i,["file","blob"])!==-1?c(new t.File(null,e)):i==="node"&&t.typeOf(e.files)==="filelist"?t.each(e.files,c):i==="array"&&(n=null,t.each(e,c))}var s=this,u=[],a=[],f;f=w(),c(e),u.length&&t.inSeries(u,function(){a.length&&s.trigger("FilesAdded",a)})},removeFile:function(e){var t=typeof e=="string"?e:e.id;for(var n=f.length-1;n>=0;n--)if(f[n].id===t)return this.splice(n,1)[0]},splice:function(e,t){var r=f.splice(e===n?0:e,t===n?f.length:t),i=!1;return this.state==o.STARTED&&(i=!0,this.stop()),this.trigger("FilesRemoved",r),o.each(r,function(e){e.destroy()}),this.trigger("QueueChanged"),this.refresh(),i&&this.start(),r},bind:function(e,t,n){var r=this;o.Uploader.prototype.bind.call(this,e,function(){var e=[].slice.call(arguments);return e.splice(0,1,r),t.apply(this,e)},0,n)},destroy:function(){this.trigger("Destroy"),a=d=null,this.unbindAll()}})},o.Uploader.prototype=t.EventTarget.instance,o.File=function(){function n(n){o.extend(this,{id:o.guid(),name:n.name||n.fileName,type:n.type||"",size:n.size||n.fileSize,origSize:n.size||n.fileSize,loaded:0,percent:0,status:o.QUEUED,lastModifiedDate:n.lastModifiedDate||(new Date).toLocaleString(),getNative:function(){var e=this.getSource().getSource();return t.inArray(t.typeOf(e),["blob","file"])!==-1?e:null},getSource:function(){return e[this.id]?e[this.id]:null},destroy:function(){var t=this.getSource();t&&(t.destroy(),delete e[this.id])}}),e[this.id]=n}var e={};return n}(),o.QueueProgress=function(){var e=this;e.size=0,e.loaded=0,e.uploaded=0,e.failed=0,e.queued=0,e.percent=0,e.bytesPerSec=0,e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}},e.plupload=o})(window,mOxie);
\ No newline at end of file
diff --git a/demo/js/highlight/highlight.js b/demo/scripts/highlight.js
similarity index 100%
rename from demo/js/highlight/highlight.js
rename to demo/scripts/highlight.js
diff --git a/demo/js/main.js b/demo/scripts/main.js
similarity index 99%
rename from demo/js/main.js
rename to demo/scripts/main.js
index 598166e4..0ab2efa5 100644
--- a/demo/js/main.js
+++ b/demo/scripts/main.js
@@ -217,7 +217,7 @@ $(function() {
var newUrl = Qiniu.pipeline(fopArr, key);
var newImg = new Image();
- img.attr('src', 'loading.gif');
+ img.attr('src', '/images/loading.gif');
newImg.onload = function() {
img.attr('src', newUrl);
img.parent('a').attr('href', newUrl);
diff --git a/demo/js/multiple.js b/demo/scripts/multiple.js
similarity index 99%
rename from demo/js/multiple.js
rename to demo/scripts/multiple.js
index 5c06ce48..3f969486 100644
--- a/demo/js/multiple.js
+++ b/demo/scripts/multiple.js
@@ -255,7 +255,7 @@ $(function() {
var newUrl = Qiniu.pipeline(fopArr, key);
var newImg = new Image();
- img.attr('src', 'loading.gif');
+ img.attr('src', '/images/loading.gif');
newImg.onload = function() {
img.attr('src', newUrl);
img.parent('a').attr('href', newUrl);
diff --git a/demo/js/ui.js b/demo/scripts/ui.js
similarity index 96%
rename from demo/js/ui.js
rename to demo/scripts/ui.js
index a18a48d5..29556c41 100644
--- a/demo/js/ui.js
+++ b/demo/scripts/ui.js
@@ -234,12 +234,12 @@ FileProgress.prototype.setComplete = function(up, info) {
var Wrapper = $('
');
var imgWrapper = $('
');
var linkWrapper = $(' ');
- var showImg = $(' ');
+ var showImg = $(' ');
progressNameTd.append(Wrapper);
if (!isImg) {
- showImg.attr('src', 'default.png');
+ showImg.attr('src', '/images/default.png');
Wrapper.addClass('default');
imgWrapper.append(showImg);
@@ -268,7 +268,7 @@ FileProgress.prototype.setComplete = function(up, info) {
$('#myModal-img').find('.text-warning').show();
}
var newImg = new Image();
- modalBody.find('img').attr('src', 'loading.gif');
+ modalBody.find('img').attr('src', '/images/loading.gif');
newImg.onload = function() {
modalBody.find('img').attr('src', url).data('key', key).data('h', height);
modalBody.find('.modal-body-wrapper').find('a').attr('href', url);
diff --git a/demo/server.js b/demo/server.js
index 4e6ecb6f..baf4d614 100644
--- a/demo/server.js
+++ b/demo/server.js
@@ -12,6 +12,8 @@ app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
app.use(express.urlencoded());
+app.use('/bower_components', express.static(__dirname + '/../bower_components'));
+app.use('/src', express.static(__dirname + '/../src'));
app.get('/uptoken', function(req, res, next) {
var token = uptoken.token();
diff --git a/demo/js/highlight/highlight.css b/demo/styles/highlight.css
similarity index 100%
rename from demo/js/highlight/highlight.css
rename to demo/styles/highlight.css
diff --git a/demo/main.css b/demo/styles/main.css
similarity index 100%
rename from demo/main.css
rename to demo/styles/main.css
diff --git a/demo/views/index.html b/demo/views/index.html
index b9d66dbc..b339ef09 100644
--- a/demo/views/index.html
+++ b/demo/views/index.html
@@ -3,13 +3,13 @@
七牛云存储 - JavaScript SDK
-
-
-
-
+
+
+
+
@@ -235,13 +235,13 @@ 图片效果查看
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/demo/views/multiple.html b/demo/views/multiple.html
index ec031ad3..556fc724 100644
--- a/demo/views/multiple.html
+++ b/demo/views/multiple.html
@@ -3,7 +3,7 @@
七牛云存储 - JavaScript SDK
-
+
diff --git a/demo/js/qiniu.js b/dist/qiniu.js
similarity index 99%
rename from demo/js/qiniu.js
rename to dist/qiniu.js
index b20e9aee..0f6ae07b 100644
--- a/demo/js/qiniu.js
+++ b/dist/qiniu.js
@@ -1,3 +1,14 @@
+/*!
+ * qiniu-js-sdk v1.0.9-beta
+ *
+ * Copyright 2015 by Qiniu
+ * Released under GPL V2 License.
+ *
+ * GitHub: http://github.com/qiniu/js-sdk
+ *
+ * Date: 2015-12-2
+*/
+
/*global plupload ,mOxie*/
/*global ActiveXObject */
/*exported Qiniu */
diff --git a/dist/qiniu.min.js b/dist/qiniu.min.js
new file mode 100644
index 00000000..61fe3d4b
--- /dev/null
+++ b/dist/qiniu.min.js
@@ -0,0 +1,3 @@
+/*! qiniu-js-sdk v1.0.9-beta | Copyright 2015 by Qiniu */
+function QiniuJsSDK(){var a;a="https:"===window.location.protocol?"https://up.qbox.me":"http://upload.qiniu.com",this.detectIEVersion=function(){var a=4,b=document.createElement("div"),c=b.getElementsByTagName("i");while(b.innerHTML="",c[0])a++;return a>4?a:!1},this.isImage=function(a){var b,c="";var d=["png","jpg","jpeg","gif","bmp"];var e=/\.([a-zA-Z0-9]+)(\?|\@|$)/;if(!a||!e.test(a))return!1;b=e.exec(a),c=b[1].toLowerCase();for(var f=0,g=d.length;g>f;f++)if(c===d[f])return!0;return!1},this.getFileExtension=function(a){var b=a.split(".");var c;return c=1===b.length||""===b[0]&&2===b.length?"":b.pop().toLowerCase()},this.utf8_encode=function(a){if(null===a||"undefined"==typeof a)return"";var b=a+"";var c="",d,e,f=0;d=e=0,f=b.length;for(var g=0;f>g;g++){var h=b.charCodeAt(g);var i=null;if(128>h)e++;else if(h>127&&2048>h)i=String.fromCharCode(h>>6|192,63&h|128);else if(63488&h^!0)i=String.fromCharCode(h>>12|224,h>>6&63|128,63&h|128);else{if(64512&h^!0)throw new RangeError("Unmatched trail surrogate at "+g);var j=b.charCodeAt(++g);if(64512&j^!0)throw new RangeError("Unmatched lead surrogate at "+(g-1));h=((1023&h)<<10)+(1023&j)+65536,i=String.fromCharCode(h>>18|240,h>>12&63|128,h>>6&63|128,63&h|128)}null!==i&&(e>d&&(c+=b.slice(d,e)),c+=i,d=e=g+1)}return e>d&&(c+=b.slice(d,f)),c},this.base64_encode=function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var c,d,e,f,g,h,i,j,k=0,l=0,m="",n=[];if(!a)return a;a=this.utf8_encode(a+"");do c=a.charCodeAt(k++),d=a.charCodeAt(k++),e=a.charCodeAt(k++),j=c<<16|d<<8|e,f=j>>18&63,g=j>>12&63,h=j>>6&63,i=63&j,n[l++]=b.charAt(f)+b.charAt(g)+b.charAt(h)+b.charAt(i);while(k=a&&c.chunk_size&&c.runtimes.indexOf("flash")>=0?c.chunk_size=0:g?c.chunk_size=0:(d=20,e=4<e&&(c.chunk_size=e))};i();var j=function(){if(c.uptoken)b.token=c.uptoken;else{var a=b.createAjax();a.open("GET",b.uptoken_url,!0),a.setRequestHeader("If-Modified-Since","0"),a.onreadystatechange=function(){if(4===a.readyState&&200===a.status){var c=b.parseJSON(a.responseText);b.token=c.uptoken}},a.send()}};var k=function(a,d,e){var f="",g=!1;if(!c.save_key)if(g=a.getOption&&a.getOption("unique_names"),g=g||a.settings&&a.settings.unique_names){var h=b.getFileExtension(d.name);f=h?d.id+"."+h:d.id}else f="function"==typeof e?e(a,d):d.name;return f};plupload.extend(d,c,{url:a,multipart_params:{token:""}});var l=new plupload.Uploader(d);return l.bind("Init",function(a,b){j()}),l.init(),l.bind("FilesAdded",function(a,b){var c=a.getOption&&a.getOption("auto_start");c=c||a.settings&&a.settings.auto_start,c&&plupload.each(b,function(b,c){a.start()}),a.refresh()}),l.bind("BeforeUpload",function(d,e){e.speed=e.speed||0,g="",c.get_new_uptoken&&j();var f=function(d,e,f){h.startTime=(new Date).getTime();var g;g=c.save_key?{token:b.token}:{key:k(d,e,f),token:b.token};var i=c.x_vars;if(void 0!==i&&"object"==typeof i)for(var j in i)i.hasOwnProperty(j)&&("function"==typeof i[j]?g["x:"+j]=i[j](d,e):"object"!=typeof i[j]&&(g["x:"+j]=i[j]));d.setOption({url:a,multipart:!0,chunk_size:void 0,multipart_params:g})};var i=d.getOption&&d.getOption("chunk_size");if(i=i||d.settings&&d.settings.chunk_size,"html5"===l.runtime&&i)if(e.sizeo-p&&100!==m.percent&&e.size===m.total?(e.percent=m.percent,e.loaded=m.offset,g=m.ctx,h.isResumeUpload=!0,h.resumeFilesize=m.offset,m.offset+n>e.size&&(n=e.size-m.offset)):localStorage.removeItem(e.name)}h.startTime=(new Date).getTime(),d.setOption({url:a+"/mkblk/"+n,multipart:!1,chunk_size:i,required_features:"chunks",headers:{Authorization:"UpToken "+b.token},multipart_params:{}})}else f(d,e,b.key_handler)}),l.bind("UploadProgress",function(a,b){h.currentTime=(new Date).getTime();var c=h.currentTime-h.startTime;var d=b.loaded||0;h.isResumeUpload&&(d=b.loaded-h.resumeFilesize),b.speed=(d/c*1e3).toFixed(0)||0}),l.bind("ChunkUploaded",function(c,d,e){var f=b.parseJSON(e.response);g=g?g+","+f.ctx:f.ctx;var h=e.total-e.offset;var i=c.getOption&&c.getOption("chunk_size");i=i||c.settings&&c.settings.chunk_size,i>h&&c.setOption({url:a+"/mkblk/"+h}),localStorage.setItem(d.name,JSON.stringify({ctx:g,percent:d.percent,total:e.total,offset:e.offset,time:(new Date).getTime()}))}),l.bind("Error",function(a){return function(c,d){var e="";var f=d.file;if(f){switch(d.code){case plupload.FAILED:e="\u4e0a\u4f20\u5931\u8d25\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002";break;case plupload.FILE_SIZE_ERROR:var g=c.getOption&&c.getOption("max_file_size");g=g||c.settings&&c.settings.max_file_size,e="\u6d4f\u89c8\u5668\u6700\u5927\u53ef\u4e0a\u4f20"+g+"\u3002\u66f4\u5927\u6587\u4ef6\u8bf7\u4f7f\u7528\u547d\u4ee4\u884c\u5de5\u5177\u3002";break;case plupload.FILE_EXTENSION_ERROR:e="\u6587\u4ef6\u9a8c\u8bc1\u5931\u8d25\u3002\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002";break;case plupload.HTTP_ERROR:if(""===d.response){e=d.message||"\u672a\u77e5\u7f51\u7edc\u9519\u8bef\u3002";break}var h=b.parseJSON(d.response);var i=h.error;switch(d.status){case 400:e="\u8bf7\u6c42\u62a5\u6587\u683c\u5f0f\u9519\u8bef\u3002";break;case 401:e="\u5ba2\u6237\u7aef\u8ba4\u8bc1\u6388\u6743\u5931\u8d25\u3002\u8bf7\u91cd\u8bd5\u6216\u63d0\u4ea4\u53cd\u9988\u3002";break;case 405:e="\u5ba2\u6237\u7aef\u8bf7\u6c42\u9519\u8bef\u3002\u8bf7\u91cd\u8bd5\u6216\u63d0\u4ea4\u53cd\u9988\u3002";break;case 579:e="\u8d44\u6e90\u4e0a\u4f20\u6210\u529f\uff0c\u4f46\u56de\u8c03\u5931\u8d25\u3002";break;case 599:e="\u7f51\u7edc\u8fde\u63a5\u5f02\u5e38\u3002\u8bf7\u91cd\u8bd5\u6216\u63d0\u4ea4\u53cd\u9988\u3002";break;case 614:e="\u6587\u4ef6\u5df2\u5b58\u5728\u3002";try{h=b.parseJSON(h.error),i=h.error||"file exists"}catch(j){i=h.error||"file exists"}break;case 631:e="\u6307\u5b9a\u7a7a\u95f4\u4e0d\u5b58\u5728\u3002";break;case 701:e="\u4e0a\u4f20\u6570\u636e\u5757\u6821\u9a8c\u51fa\u9519\u3002\u8bf7\u91cd\u8bd5\u6216\u63d0\u4ea4\u53cd\u9988\u3002";break;default:e="\u672a\u77e5\u9519\u8bef\u3002"}e=e+"("+d.status+"\uff1a"+i+")";break;case plupload.SECURITY_ERROR:e="\u5b89\u5168\u914d\u7f6e\u9519\u8bef\u3002\u8bf7\u8054\u7cfb\u7f51\u7ad9\u7ba1\u7406\u5458\u3002";break;case plupload.GENERIC_ERROR:e="\u4e0a\u4f20\u5931\u8d25\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002";break;case plupload.IO_ERROR:e="\u4e0a\u4f20\u5931\u8d25\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002";break;case plupload.INIT_ERROR:e="\u7f51\u7ad9\u914d\u7f6e\u9519\u8bef\u3002\u8bf7\u8054\u7cfb\u7f51\u7ad9\u7ba1\u7406\u5458\u3002",l.destroy();break;default:e=d.message+d.details}a&&a(c,d,e)}c.refresh()}}(e)),l.bind("FileUploaded",function(d){return function(e,f,h){var i=function(a,e,f){if(c.downtoken_url){var g=b.createAjax();g.open("POST",c.downtoken_url,!0),g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onreadystatechange=function(){if(4===g.readyState)if(200===g.status){var c;try{c=b.parseJSON(g.responseText)}catch(h){throw"invalid json format"}var i={};plupload.extend(i,b.parseJSON(f),c),d&&d(a,e,JSON.stringify(i))}else l.trigger("Error",{status:g.status,response:g.responseText,file:e,code:plupload.HTTP_ERROR})},g.send("key="+b.parseJSON(f).key+"&domain="+c.domain)}else d&&d(a,e,f)};var j=b.parseJSON(h.response);if(g=g?g:j.ctx){var m="";c.save_key||(m=k(e,f,b.key_handler),m=m?"/key/"+b.URLSafeBase64Encode(m):"");var n="/fname/"+b.URLSafeBase64Encode(f.name);var o=c.x_vars,p="",q="";if(void 0!==o&&"object"==typeof o)for(var r in o)o.hasOwnProperty(r)&&("function"==typeof o[r]?p=b.URLSafeBase64Encode(o[r](e,f)):"object"!=typeof o[r]&&(p=b.URLSafeBase64Encode(o[r])),q+="/x:"+r+"/"+p);var s=a+"/mkfile/"+f.size+m+n+q;var t=b.createAjax();t.open("POST",s,!0),t.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),t.setRequestHeader("Authorization","UpToken "+b.token),t.onreadystatechange=function(){if(4===t.readyState)if(localStorage.removeItem(f.name),200===t.status){var a=t.responseText;i(e,f,a)}else l.trigger("Error",{status:t.status,response:t.responseText,file:f,code:-200})},t.send(g)}else i(e,f,h.response)}}(f)),l},this.getUrl=function(a){if(!a)return!1;a=encodeURI(a);var b=this.domain;return"/"!==b.slice(b.length-1)&&(b+="/"),b+a},this.imageView2=function(a,b){var c=a.mode||"",d=a.w||"",e=a.h||"",f=a.q||"",g=a.format||"";if(!c)return!1;if(!d&&!e)return!1;var h="imageView2/"+c;return h+=d?"/w/"+d:"",h+=e?"/h/"+e:"",h+=f?"/q/"+f:"",h+=g?"/format/"+g:"",b&&(h=this.getUrl(b)+"?"+h),h},this.imageMogr2=function(a,b){var c=a["auto-orient"]||"",d=a.thumbnail||"",e=a.strip||"",f=a.gravity||"",g=a.crop||"",h=a.quality||"",i=a.rotate||"",j=a.format||"",k=a.blur||"";var l="imageMogr2";return l+=c?"/auto-orient":"",l+=d?"/thumbnail/"+d:"",l+=e?"/strip":"",l+=f?"/gravity/"+f:"",l+=h?"/quality/"+h:"",l+=g?"/crop/"+g:"",l+=i?"/rotate/"+i:"",l+=j?"/format/"+j:"",l+=k?"/blur/"+k:"",b&&(l=this.getUrl(b)+"?"+l),l},this.watermark=function(a,b){var c=a.mode;if(!c)return!1;var d="watermark/"+c;if(1===c){var e=a.image||"";if(!e)return!1;d+=e?"/image/"+this.URLSafeBase64Encode(e):""}else{if(2!==c)return!1;var f=a.text?a.text:"",g=a.font?a.font:"",h=a.fontsize?a.fontsize:"",i=a.fill?a.fill:"";if(!f)return!1;d+=f?"/text/"+this.URLSafeBase64Encode(f):"",d+=g?"/font/"+this.URLSafeBase64Encode(g):"",d+=h?"/fontsize/"+h:"",d+=i?"/fill/"+this.URLSafeBase64Encode(i):""}var j=a.dissolve||"",k=a.gravity||"",l=a.dx||"",m=a.dy||"";return d+=j?"/dissolve/"+j:"",d+=k?"/gravity/"+k:"",d+=l?"/dx/"+l:"",d+=m?"/dy/"+m:"",b&&(d=this.getUrl(b)+"?"+d),d},this.imageInfo=function(a){if(!a)return!1;var b=this.getUrl(a)+"?imageInfo";var c=this.createAjax();var d;var e=this;return c.open("GET",b,!1),c.onreadystatechange=function(){4===c.readyState&&200===c.status&&(d=e.parseJSON(c.responseText))},c.send(),d},this.exif=function(a){if(!a)return!1;var b=this.getUrl(a)+"?exif";var c=this.createAjax();var d;var e=this;return c.open("GET",b,!1),c.onreadystatechange=function(){4===c.readyState&&200===c.status&&(d=e.parseJSON(c.responseText))},c.send(),d},this.get=function(a,b){return b&&a?"exif"===a?this.exif(b):"imageInfo"===a?this.imageInfo(b):!1:!1},this.pipeline=function(a,b){var c="[object Array]"===Object.prototype.toString.call(a);var d,e,f="";if(c){for(var g=0,h=a.length;h>g;g++){if(d=a[g],!d.fop)return!1;switch(d.fop){case"watermark":f+=this.watermark(d)+"|";break;case"imageView2":f+=this.imageView2(d)+"|";break;case"imageMogr2":f+=this.imageMogr2(d)+"|";break;default:e=!0}if(e)return!1}if(b){f=this.getUrl(b)+"?"+f;var i=f.length;"|"===f.slice(i-1)&&(f=f.slice(0,i-1))}return f}return!1}}var Qiniu=new QiniuJsSDK;
+//# sourceMappingURL=dist/qiniu.min.map
\ No newline at end of file
diff --git a/dist/qiniu.min.map b/dist/qiniu.min.map
new file mode 100644
index 00000000..6ac74c97
--- /dev/null
+++ b/dist/qiniu.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"dist/qiniu.min.js","sources":["dist/qiniu.js"],"names":["QiniuJsSDK","qiniuUploadUrl","window","location","protocol","this","detectIEVersion","v","div","document","createElement","all","getElementsByTagName","innerHTML","isImage","url","res","suffix","imageSuffixes","suffixMatch","test","exec","toLowerCase","i","l","length","getFileExtension","filename","tempArr","split","ext","pop","utf8_encode","argString","string","utftext","start","end","stringl","n","c1","charCodeAt","enc","String","fromCharCode","RangeError","c2","slice","base64_encode","data","b64","o1","o2","o3","h1","h2","h3","h4","bits","ac","tmp_arr","charAt","join","URLSafeBase64Encode","replace","createAjax","argument","xmlhttp","XMLHttpRequest","ActiveXObject","parseJSON","JSON","parse","trim","text","that","uploader","op","domain","browse_button","option","_Error_Handler","init","Error","_FileUploaded_Handler","FileUploaded","uptoken_url","token","key_handler","Key","ctx","speedCalInfo","isResumeUpload","resumeFilesize","startTime","currentTime","reset_chunk_size","ie","BLOCK_BITS","MAX_CHUNK_SIZE","chunk_size","isSpecialSafari","mOxie","Env","browser","version","os","osVersion","runtimes","indexOf","plupload","parseSize","getUpToken","uptoken","ajax","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","getFileKey","up","file","func","key","unique_names","save_key","getOption","settings","name","id","extend","multipart_params","Uploader","bind","params","files","auto_start","each","refresh","speed","get_new_uptoken","directUpload","Date","getTime","multipart_params_obj","x_vars","undefined","x_key","hasOwnProperty","setOption","multipart","runtime","size","localFileInfo","localStorage","getItem","blockSize","now","before","time","aDay","percent","total","loaded","offset","removeItem","required_features","headers","Authorization","timeUsed","fileUploaded","toFixed","info","response","leftSize","setItem","stringify","err","errTip","code","FAILED","FILE_SIZE_ERROR","max_file_size","FILE_EXTENSION_ERROR","HTTP_ERROR","message","errorObj","errorText","error","e","SECURITY_ERROR","GENERIC_ERROR","IO_ERROR","INIT_ERROR","destroy","details","last_step","downtoken_url","ajax_downtoken","res_downtoken","info_extended","trigger","fname","x_val","x_vars_url","getUrl","encodeURI","imageView2","mode","w","h","q","format","imageUrl","imageMogr2","auto_orient","thumbnail","strip","gravity","crop","quality","rotate","blur","watermark","image","font","fontsize","fill","dissolve","dx","dy","imageInfo","xhr","exif","get","type","pipeline","arr","isArray","Object","prototype","toString","call","errOp","len","fop","Qiniu"],"mappings":"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"}
\ No newline at end of file
diff --git a/package.json b/package.json
index f8efa0e4..cc823af9 100644
--- a/package.json
+++ b/package.json
@@ -1,19 +1,22 @@
{
- "name": "qiniu-js-sdk",
- "version": "1.0.7-beta",
- "private": false,
- "scripts": {
- "start": "node demo/server.js"
- },
- "dependencies": {
- "express": "~3.4.7",
- "qiniu": "~6.1.1",
- "ejs": "~1.0.0",
- "grunt": "~0.4.2",
- "grunt-cli": "~0.1.13",
- "grunt-contrib-jshint": "~0.7.2",
- "grunt-contrib-watch": "~0.5.3",
- "grunt-contrib-uglify": "~0.2.2",
- "grunt-contrib-copy": "~0.5.0"
- }
+ "name": "qiniu-js-sdk",
+ "jsName": "qiniu",
+ "version": "1.0.9-beta",
+ "private": false,
+ "scripts": {
+ "start": "node demo/server.js"
+ },
+ "dependencies": {
+ "bower": "^1.6.8",
+ "ejs": "~1.0.0",
+ "express": "~3.4.7",
+ "grunt": "~0.4.2",
+ "grunt-cli": "~0.1.13",
+ "grunt-contrib-concat": "^0.5.1",
+ "grunt-contrib-copy": "~0.5.0",
+ "grunt-contrib-jshint": "~0.7.2",
+ "grunt-contrib-uglify": "~0.2.2",
+ "grunt-contrib-watch": "~0.5.3",
+ "qiniu": "~6.1.1"
+ }
}
diff --git a/src/qiniu.js b/src/qiniu.js
index b20e9aee..78aa2a87 100644
--- a/src/qiniu.js
+++ b/src/qiniu.js
@@ -1,3 +1,14 @@
+/*!
+ * qiniu-js-sdk v@VERSION
+ *
+ * Copyright 2015 by Qiniu
+ * Released under GPL V2 License.
+ *
+ * GitHub: http://github.com/qiniu/js-sdk
+ *
+ * Date: @DATE
+*/
+
/*global plupload ,mOxie*/
/*global ActiveXObject */
/*exported Qiniu */
diff --git a/src/qiniu.min.js b/src/qiniu.min.js
deleted file mode 100644
index d252a0df..00000000
--- a/src/qiniu.min.js
+++ /dev/null
@@ -1 +0,0 @@
-function QiniuJsSDK(){var a;a="https:"===window.location.protocol?"https://up.qbox.me":"http://upload.qiniu.com",this.detectIEVersion=function(){for(var a=4,b=document.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="",c[0];)a++;return a>4?a:!1},this.isImage=function(a){var b,c="",d=["png","jpg","jpeg","gif","bmp"],e=/\.([a-zA-Z0-9]+)(\?|\@|$)/;if(!a||!e.test(a))return!1;b=e.exec(a),c=b[1].toLowerCase();for(var f=0,g=d.length;g>f;f++)if(c===d[f])return!0;return!1},this.getFileExtension=function(a){var b,c=a.split(".");return b=1===c.length||""===c[0]&&2===c.length?"":c.pop().toLowerCase()},this.utf8_encode=function(a){if(null===a||"undefined"==typeof a)return"";var b,c,d=a+"",e="",f=0;b=c=0,f=d.length;for(var g=0;f>g;g++){var h=d.charCodeAt(g),i=null;if(128>h)c++;else if(h>127&&2048>h)i=String.fromCharCode(h>>6|192,63&h|128);else if(63488&h^!0)i=String.fromCharCode(h>>12|224,h>>6&63|128,63&h|128);else{if(64512&h^!0)throw new RangeError("Unmatched trail surrogate at "+g);var j=d.charCodeAt(++g);if(64512&j^!0)throw new RangeError("Unmatched lead surrogate at "+(g-1));h=((1023&h)<<10)+(1023&j)+65536,i=String.fromCharCode(h>>18|240,h>>12&63|128,h>>6&63|128,63&h|128)}null!==i&&(c>b&&(e+=d.slice(b,c)),e+=i,b=c=g+1)}return c>b&&(e+=d.slice(b,f)),e},this.base64_encode=function(a){var b,c,d,e,f,g,h,i,j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",k=0,l=0,m="",n=[];if(!a)return a;a=this.utf8_encode(a+"");do b=a.charCodeAt(k++),c=a.charCodeAt(k++),d=a.charCodeAt(k++),i=b<<16|c<<8|d,e=i>>18&63,f=i>>12&63,g=i>>6&63,h=63&i,n[l++]=j.charAt(e)+j.charAt(f)+j.charAt(g)+j.charAt(h);while(k=f&&c.chunk_size&&c.runtimes.indexOf("flash")>=0?c.chunk_size=0:g?c.chunk_size=0:(a=20,d=4<d&&(c.chunk_size=d))};i();var j=function(){if(c.uptoken)b.token=c.uptoken;else{var a=b.createAjax();a.open("GET",b.uptoken_url,!0),a.setRequestHeader("If-Modified-Since","0"),a.onreadystatechange=function(){if(4===a.readyState&&200===a.status){var c=b.parseJSON(a.responseText);b.token=c.uptoken}},a.send()}},k=function(a,d,e){var f="",g=!1;if(!c.save_key)if(g=a.getOption&&a.getOption("unique_names"),g=g||a.settings&&a.settings.unique_names){var h=b.getFileExtension(d.name);f=h?d.id+"."+h:d.id}else f="function"==typeof e?e(a,d):d.name;return f};plupload.extend(d,c,{url:a,multipart_params:{token:""}});var l=new plupload.Uploader(d);return l.bind("Init",function(a,b){j()}),l.init(),l.bind("FilesAdded",function(a,b){var c=a.getOption&&a.getOption("auto_start");c=c||a.settings&&a.settings.auto_start,c&&plupload.each(b,function(b,c){a.start()}),a.refresh()}),l.bind("BeforeUpload",function(d,e){e.speed=e.speed||0,g="",c.get_new_uptoken&&j();var f=function(d,e,f){h.startTime=(new Date).getTime();var g;g=c.save_key?{token:b.token}:{key:k(d,e,f),token:b.token};var i=c.x_vars;if(void 0!==i&&"object"==typeof i)for(var j in i)i.hasOwnProperty(j)&&("function"==typeof i[j]?g["x:"+j]=i[j](d,e):"object"!=typeof i[j]&&(g["x:"+j]=i[j]));d.setOption({url:a,multipart:!0,chunk_size:void 0,multipart_params:g})},i=d.getOption&&d.getOption("chunk_size");if(i=i||d.settings&&d.settings.chunk_size,"html5"===l.runtime&&i)if(e.sizeo-p&&100!==m.percent&&e.size===m.total?(e.percent=m.percent,e.loaded=m.offset,g=m.ctx,h.isResumeUpload=!0,h.resumeFilesize=m.offset,m.offset+n>e.size&&(n=e.size-m.offset)):localStorage.removeItem(e.name)}h.startTime=(new Date).getTime(),d.setOption({url:a+"/mkblk/"+n,multipart:!1,chunk_size:i,required_features:"chunks",headers:{Authorization:"UpToken "+b.token},multipart_params:{}})}else f(d,e,b.key_handler)}),l.bind("UploadProgress",function(a,b){h.currentTime=(new Date).getTime();var c=h.currentTime-h.startTime,d=b.loaded||0;h.isResumeUpload&&(d=b.loaded-h.resumeFilesize),b.speed=(d/c*1e3).toFixed(0)||0}),l.bind("ChunkUploaded",function(c,d,e){var f=b.parseJSON(e.response);g=g?g+","+f.ctx:f.ctx;var h=e.total-e.offset,i=c.getOption&&c.getOption("chunk_size");i=i||c.settings&&c.settings.chunk_size,i>h&&c.setOption({url:a+"/mkblk/"+h}),localStorage.setItem(d.name,JSON.stringify({ctx:g,percent:d.percent,total:e.total,offset:e.offset,time:(new Date).getTime()}))}),l.bind("Error",function(a){return function(c,d){var e="",f=d.file;if(f){switch(d.code){case plupload.FAILED:e="上传失败。请稍后再试。";break;case plupload.FILE_SIZE_ERROR:var g=c.getOption&&c.getOption("max_file_size");g=g||c.settings&&c.settings.max_file_size,e="浏览器最大可上传"+g+"。更大文件请使用命令行工具。";break;case plupload.FILE_EXTENSION_ERROR:e="文件验证失败。请稍后重试。";break;case plupload.HTTP_ERROR:if(""===d.response){e=d.message||"未知网络错误。";break}var h=b.parseJSON(d.response),i=h.error;switch(d.status){case 400:e="请求报文格式错误。";break;case 401:e="客户端认证授权失败。请重试或提交反馈。";break;case 405:e="客户端请求错误。请重试或提交反馈。";break;case 579:e="资源上传成功,但回调失败。";break;case 599:e="网络连接异常。请重试或提交反馈。";break;case 614:e="文件已存在。";try{h=b.parseJSON(h.error),i=h.error||"file exists"}catch(j){i=h.error||"file exists"}break;case 631:e="指定空间不存在。";break;case 701:e="上传数据块校验出错。请重试或提交反馈。";break;default:e="未知错误。"}e=e+"("+d.status+":"+i+")";break;case plupload.SECURITY_ERROR:e="安全配置错误。请联系网站管理员。";break;case plupload.GENERIC_ERROR:e="上传失败。请稍后再试。";break;case plupload.IO_ERROR:e="上传失败。请稍后再试。";break;case plupload.INIT_ERROR:e="网站配置错误。请联系网站管理员。",l.destroy();break;default:e=d.message+d.details}a&&a(c,d,e)}c.refresh()}}(e)),l.bind("FileUploaded",function(d){return function(e,f,h){var i=function(a,e,f){if(c.downtoken_url){var g=b.createAjax();g.open("POST",c.downtoken_url,!0),g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onreadystatechange=function(){if(4===g.readyState)if(200===g.status){var c;try{c=b.parseJSON(g.responseText)}catch(h){throw"invalid json format"}var i={};plupload.extend(i,b.parseJSON(f),c),d&&d(a,e,JSON.stringify(i))}else l.trigger("Error",{status:g.status,response:g.responseText,file:e,code:plupload.HTTP_ERROR})},g.send("key="+b.parseJSON(f).key+"&domain="+c.domain)}else d&&d(a,e,f)},j=b.parseJSON(h.response);if(g=g?g:j.ctx){var m="";c.save_key||(m=k(e,f,b.key_handler),m=m?"/key/"+b.URLSafeBase64Encode(m):"");var n="/fname/"+b.URLSafeBase64Encode(f.name),o=c.x_vars,p="",q="";if(void 0!==o&&"object"==typeof o)for(var r in o)o.hasOwnProperty(r)&&("function"==typeof o[r]?p=b.URLSafeBase64Encode(o[r](e,f)):"object"!=typeof o[r]&&(p=b.URLSafeBase64Encode(o[r])),q+="/x:"+r+"/"+p);var s=a+"/mkfile/"+f.size+m+n+q,t=b.createAjax();t.open("POST",s,!0),t.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),t.setRequestHeader("Authorization","UpToken "+b.token),t.onreadystatechange=function(){if(4===t.readyState)if(localStorage.removeItem(f.name),200===t.status){var a=t.responseText;i(e,f,a)}else l.trigger("Error",{status:t.status,response:t.responseText,file:f,code:-200})},t.send(g)}else i(e,f,h.response)}}(f)),l},this.getUrl=function(a){if(!a)return!1;a=encodeURI(a);var b=this.domain;return"/"!==b.slice(b.length-1)&&(b+="/"),b+a},this.imageView2=function(a,b){var c=a.mode||"",d=a.w||"",e=a.h||"",f=a.q||"",g=a.format||"";if(!c)return!1;if(!d&&!e)return!1;var h="imageView2/"+c;return h+=d?"/w/"+d:"",h+=e?"/h/"+e:"",h+=f?"/q/"+f:"",h+=g?"/format/"+g:"",b&&(h=this.getUrl(b)+"?"+h),h},this.imageMogr2=function(a,b){var c=a["auto-orient"]||"",d=a.thumbnail||"",e=a.strip||"",f=a.gravity||"",g=a.crop||"",h=a.quality||"",i=a.rotate||"",j=a.format||"",k=a.blur||"",l="imageMogr2";return l+=c?"/auto-orient":"",l+=d?"/thumbnail/"+d:"",l+=e?"/strip":"",l+=f?"/gravity/"+f:"",l+=h?"/quality/"+h:"",l+=g?"/crop/"+g:"",l+=i?"/rotate/"+i:"",l+=j?"/format/"+j:"",l+=k?"/blur/"+k:"",b&&(l=this.getUrl(b)+"?"+l),l},this.watermark=function(a,b){var c=a.mode;if(!c)return!1;var d="watermark/"+c;if(1===c){var e=a.image||"";if(!e)return!1;d+=e?"/image/"+this.URLSafeBase64Encode(e):""}else{if(2!==c)return!1;var f=a.text?a.text:"",g=a.font?a.font:"",h=a.fontsize?a.fontsize:"",i=a.fill?a.fill:"";if(!f)return!1;d+=f?"/text/"+this.URLSafeBase64Encode(f):"",d+=g?"/font/"+this.URLSafeBase64Encode(g):"",d+=h?"/fontsize/"+h:"",d+=i?"/fill/"+this.URLSafeBase64Encode(i):""}var j=a.dissolve||"",k=a.gravity||"",l=a.dx||"",m=a.dy||"";return d+=j?"/dissolve/"+j:"",d+=k?"/gravity/"+k:"",d+=l?"/dx/"+l:"",d+=m?"/dy/"+m:"",b&&(d=this.getUrl(b)+"?"+d),d},this.imageInfo=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?imageInfo",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.exif=function(a){if(!a)return!1;var b,c=this.getUrl(a)+"?exif",d=this.createAjax(),e=this;return d.open("GET",c,!1),d.onreadystatechange=function(){4===d.readyState&&200===d.status&&(b=e.parseJSON(d.responseText))},d.send(),b},this.get=function(a,b){return b&&a?"exif"===a?this.exif(b):"imageInfo"===a?this.imageInfo(b):!1:!1},this.pipeline=function(a,b){var c,d,e="[object Array]"===Object.prototype.toString.call(a),f="";if(e){for(var g=0,h=a.length;h>g;g++){if(c=a[g],!c.fop)return!1;switch(c.fop){case"watermark":f+=this.watermark(c)+"|";break;case"imageView2":f+=this.imageView2(c)+"|";break;case"imageMogr2":f+=this.imageMogr2(c)+"|";break;default:d=!0}if(d)return!1}if(b){f=this.getUrl(b)+"?"+f;var i=f.length;"|"===f.slice(i-1)&&(f=f.slice(0,i-1))}return f}return!1}}var Qiniu=new QiniuJsSDK;
\ No newline at end of file