;var MXI_DEBUG=false;
(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];
}}
define('moxie/core/utils/Basic', [], function(){
var typeOf=function(o){
var undef;
if(o===undef){
return 'undefined';
}else if(o===null){
return 'null';
}else if(o.nodeType){
return 'node';
}
return ({}).toString.call(o).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
};
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;
};
var each=function(obj, callback){
var length, key, i, undef;
if(obj){
if(typeOf(obj.length)==='number'){
for (i=0, length=obj.length; i < length; i++){
if(callback(obj[i], i)===false){
return;
}}
}else if(typeOf(obj)==='object'){
for (key in obj){
if(obj.hasOwnProperty(key)){
if(callback(obj[key], key)===false){
return;
}}
}}
}};
var isEmptyObj=function(obj){
var prop;
if(!obj||typeOf(obj)!=='object'){
return true;
}
for (prop in obj){
return false;
}
return true;
};
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){
++i < length&&!error ? callNext(i):cb(error);
});
}}
callNext(i);
};
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();
cbArgs[i]=args;
count++;
if(count===num){
cbArgs.unshift(null);
cb.apply(this, cbArgs);
}});
});
};
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;
};
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;
};
var arrayIntersect=function(array1, array2){
var result=[];
each(array1, function(item){
if(inArray(item, array2)!==-1){
result.push(item);
}});
return result.length ? result:null;
};
var toArray=function(obj){
var i, arr=[];
for (i=0; i < obj.length; i++){
arr[i]=obj[i];
}
return arr;
};
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);
};}());
var trim=function(str){
if(!str){
return str;
}
return String.prototype.trim ? String.prototype.trim.call(str):str.toString().replace(/^\s*/, '').replace(/\s*$/, '');
};
var parseSizeStr=function(size){
if(typeof(size)!=='string'){
return size;
}
var muls={
t: 1099511627776,
g: 1073741824,
m: 1048576,
k: 1024
},
mul;
size=/^([0-9\.]+)([tmgk]?)$/.exec(size.toLowerCase().replace(/[^0-9\.tmkg]/g, ''));
mul=size[2];
size=+size[1];
if(muls.hasOwnProperty(mul)){
size *=muls[mul];
}
return Math.floor(size);
};
var sprintf=function(str){
var args=[].slice.call(arguments, 1);
return str.replace(/%[a-z]/g, function(){
var value=args.shift();
return typeOf(value)!=='undefined' ? value:'';
});
};
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,
sprintf: sprintf,
parseSizeStr: parseSizeStr
};});
define("moxie/core/utils/Env", [
"moxie/core/utils/Basic"
], function(Basic){
var UAParser=(function (undefined){
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';
var util={
has:function (str1, str2){
return str2.toLowerCase().indexOf(str1.toLowerCase())!==-1;
},
lowerize:function (str){
return str.toLowerCase();
}};
var mapper={
rgx:function (){
for (var result, i=0, j, k, p, q, matches, match, args=arguments; i < args.length; i +=2){
var regex=args[i],
props=args[i + 1];
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;
}}
}
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];
if(typeof(q)===OBJ_TYPE&&q.length > 0){
if(q.length==2){
if(typeof(q[1])==FUNC_TYPE){
result[q[0]]=q[1].call(this, match);
}else{
result[q[0]]=q[1];
}}else if(q.length==3){
if(typeof(q[1])===FUNC_TYPE&&!(q[1].exec&&q[1].test)){
result[q[0]]=match ? q[1].call(this, match, q[2]):undefined;
}else{
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;
}
return result;
},
str:function (str, map){
for (var i in map){
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;
}};
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'
}}
}};
var regexes={
browser:[[
/(opera\smini)\/([\w\.-]+)/i,
/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,
/(opera).+version\/([\w\.]+)/i,
/(opera)[\/\s]+([\w\.]+)/i
], [NAME, VERSION], [
/\s(opr)\/([\w\.]+)/i
], [[NAME, 'Opera'], VERSION], [
/(kindle)\/([\w\.]+)/i,
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
/(?:ms|\()(ie)\s([\w\.]+)/i,
/(rekonq)\/([\w\.]+)*/i,
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i
], [NAME, VERSION], [
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i
], [[NAME, 'IE'], VERSION], [
/(edge)\/((\d+)?[\w\.]+)/i
], [NAME, VERSION], [
/(yabrowser)\/([\w\.]+)/i
], [[NAME, 'Yandex'], VERSION], [
/(comodo_dragon)\/([\w\.]+)/i
], [[NAME, /_/g, ' '], VERSION], [
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i
], [NAME, VERSION], [
/(dolfin)\/([\w\.]+)/i
], [[NAME, 'Dolphin'], VERSION], [
/((?:android.+)crmo|crios)\/([\w\.]+)/i
], [[NAME, 'Chrome'], VERSION], [
/XiaoMi\/MiuiBrowser\/([\w\.]+)/i
], [VERSION, [NAME, 'MIUI Browser']], [
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i
], [VERSION, [NAME, 'Android Browser']], [
/FBAV\/([\w\.]+);/i
], [VERSION, [NAME, 'Facebook']], [
/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i
], [VERSION, [NAME, 'Mobile Safari']], [
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i
], [VERSION, NAME], [
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
/(konqueror)\/([\w\.]+)/i,
/(webkit|khtml)\/([\w\.]+)/i
], [NAME, VERSION], [
/(navigator|netscape)\/([\w\.-]+)/i
], [[NAME, 'Netscape'], VERSION], [
/(swiftfox)/i,
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,
/(links)\s\(([\w\.]+)/i,
/(gobrowser)\/?([\w\.]+)*/i,
/(ice\s?browser)\/v?([\w\._]+)/i,
/(mosaic)[\/\s]([\w\.]+)/i
], [NAME, VERSION]
],
engine:[[
/windows.+\sedge\/([\w\.]+)/i
], [VERSION, [NAME, 'EdgeHTML']], [
/(presto)\/([\w\.]+)/i,
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,
/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,
/(icab)[\/\s]([23]\.[\d\.]+)/i
], [NAME, VERSION], [
/rv\:([\w\.]+).*(gecko)/i
], [VERSION, NAME]
],
os:[[
/microsoft\s(windows)\s(vista|xp)/i
], [NAME, VERSION], [
/(windows)\snt\s6\.2;\s(arm)/i,
/(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]], [
/\((bb)(10);/i
], [[NAME, 'BlackBerry'], VERSION], [
/(blackberry)\w*\/?([\w\.]+)*/i,
/(tizen)[\/\s]([\w\.]+)/i,
/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
/linux;.+(sailfish);/i
], [NAME, VERSION], [
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i
], [[NAME, 'Symbian'], VERSION], [
/\((series40);/i
], [NAME], [
/mozilla.+\(mobile;.+gecko.+firefox/i
], [[NAME, 'Firefox OS'], VERSION], [
/(nintendo|playstation)\s([wids3portablevu]+)/i,
/(mint)[\/\s\(]?(\w+)*/i,
/(mageia|vectorlinux)[;\s]/i,
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,
/(hurd|linux)\s?([\w\.]+)*/i,
/(gnu)\s?([\w\.]+)*/i
], [NAME, VERSION], [
/(cros)\s[\w]+\s([\w\.]+\w)/i
], [[NAME, 'Chromium OS'], VERSION],[
/(sunos)\s?([\w\.]+\d)*/i
], [[NAME, 'Solaris'], VERSION], [
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i
], [NAME, VERSION],[
/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
/(macintosh|mac(?=_powerpc)\s)/i
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,
/(haiku)\s(\w+)/i,
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
/(unix)\s?([\w\.]+)*/i
], [NAME, VERSION]
]
};
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 UAParser;
})();
function version_compare(v1, v2, operator){
var i=0,
x=0,
compare=0,
vm={
'dev': -6,
'alpha': -5,
'a': -5,
'beta': -4,
'b': -4,
'RC': -3,
'rc': -3,
'#': -2,
'p': 1,
'pl': 1
},
prepVersion=function (v){
v=('' + v).replace(/[_\-+]/g, '.');
v=v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
return (!v.length ? [-8]:v.split('.'));
},
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;
}
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(){
return false;
}()),
create_canvas: (function(){
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', '/');
if('responseType' in xhr){
xhr.responseType=responseType;
if(xhr.responseType!==responseType){
return false;
}
return true;
}}
} catch (ex){}
return false;
},
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(){
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(){
if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/)){
return false;
}
var el=document.createElement('input');
el.setAttribute('type', 'file');
return !el.disabled;
}};
return function(cap){
var args=[].slice.call(arguments);
args.shift();
return Basic.typeOf(caps[cap])==='function' ? caps[cap].apply(this, args):!!caps[cap];
};}());
var uaResult=new UAParser().getResult();
var Env={
can: can,
uaParser: UAParser,
browser: uaResult.browser.name,
version: uaResult.browser.version,
os: uaResult.os.name,
osVersion: uaResult.os.version,
verComp: version_compare,
global_event_dispatcher: "moxie.core.EventTarget.instance.dispatchEvent"
};
Env.OS=Env.os;
if(MXI_DEBUG){
Env.debug={
runtime: true,
events: false
};
Env.log=function(){
function logObj(data){
console.appendChild(document.createTextNode(data + "\n"));
}
var data=arguments[0];
if(Basic.typeOf(data)==='string'){
data=Basic.sprintf.apply(this, arguments);
}
if(window&&window.console&&window.console.log){
window.console.log(data);
}else if(document){
var console=document.getElementById('moxie-console');
if(!console){
console=document.createElement('pre');
console.id='moxie-console';
document.body.appendChild(console);
}
if(Basic.inArray(Basic.typeOf(data), ['object', 'array'])!==-1){
logObj(data);
}else{
console.appendChild(document.createTextNode(data + "\n"));
}}
};}
return Env;
});
define("moxie/core/I18n", [
"moxie/core/utils/Basic"
], function(Basic){
var i18n={};
return {
addI18n: function(pack){
return Basic.extend(i18n, pack);
},
translate: function(str){
return i18n[str]||str;
},
_: function(str){
return this.translate(str);
},
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:'';
});
}};});
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: {},
addMimeType: function (mimeData){
var items=mimeData.split(/,/), i, ii, ext;
for (i=0; i < items.length; i +=2){
ext=items[i + 1].split(/ /);
for (ii=0; ii < ext.length; ii++){
this.mimes[ext[ii]]=items[i];
}
this.extensions[items[i]]=ext;
}},
extList2mimes: function (filters, addMissingExtensions){
var self=this, ext, i, ii, type, mimes=[];
for (i=0; i < filters.length; i++){
ext=filters[i].extensions.split(/\s*,\s*/);
for (ii=0; ii < ext.length; ii++){
if(ext[ii]==='*'){
return [];
}
type=self.mimes[ext[ii]];
if(type&&Basic.inArray(type, mimes)===-1){
mimes.push(type);
}
if(addMissingExtensions&&/^\w+$/.test(ext[ii])){
mimes.push('.' + ext[ii]);
}else if(!type){
return [];
}}
}
return mimes;
},
mimes2exts: function(mimes){
var self=this, exts=[];
Basic.each(mimes, function(mime){
if(mime==='*'){
exts=[];
return false;
}
var m=mime.match(/^(\w+)\/(\*|\w+)$/);
if(m){
if(m[2]==='*'){
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(','):'*'
});
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;
});
define('moxie/core/utils/Dom', ['moxie/core/utils/Env'], function(Env){
var get=function(id){
if(typeof id!=='string'){
return id;
}
return document.getElementById(id);
};
var hasClass=function(obj, name){
if(!obj.className){
return false;
}
var regExp=new RegExp("(^|\\s+)"+name+"(\\s+|$)");
return regExp.test(obj.className);
};
var addClass=function(obj, name){
if(!hasClass(obj, name)){
obj.className = !obj.className ? name:obj.className.replace(/\s+$/, '') + ' ' + 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===' ' ? ' ':'';
});
}};
var getStyle=function(obj, name){
if(obj.currentStyle){
return obj.currentStyle[name];
}else if(window.getComputedStyle){
return window.getComputedStyle(obj, null)[name];
}};
var getPos=function(node, root){
var x=0, y=0, parent, doc=document, nodeRect, rootRect;
node=node;
root=root||doc.body;
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
};}
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
};};
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
};});
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,
INVALID_META_ERR: 3
};
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;
}())
};});
define('moxie/core/EventTarget', [
'moxie/core/utils/Env',
'moxie/core/Exceptions',
'moxie/core/utils/Basic'
], function(Env, x, Basic){
function EventTarget(){
var eventpool={};
Basic.extend(this, {
uid: null,
init: function(){
if(!this.uid){
this.uid=Basic.guid('uid_');
}},
addEventListener: function(type, fn, priority, scope){
var self=this, list;
if(!this.hasOwnProperty('uid')){
this.uid=Basic.guid('uid_');
}
type=Basic.trim(type);
if(/\s/.test(type)){
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;
},
hasEventListener: function(type){
var list=type ? eventpool[this.uid]&&eventpool[this.uid][type]:eventpool[this.uid];
return list ? list:false;
},
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=[];
}
if(!list.length){
delete eventpool[this.uid][type];
if(Basic.isEmptyObj(eventpool[this.uid])){
delete eventpool[this.uid];
}}
}},
removeAllEventListeners: function(){
if(eventpool[this.uid]){
delete eventpool[this.uid];
}},
dispatchEvent: function(type){
var uid, list, args, tmpEvt, evt={}, result=true, undef;
if(Basic.typeOf(type)!=='string'){
tmpEvt=type;
if(Basic.typeOf(tmpEvt.type)==='string'){
type=tmpEvt.type;
if(tmpEvt.total!==undef&&tmpEvt.loaded!==undef){
evt.total=tmpEvt.total;
evt.loaded=tmpEvt.loaded;
}
evt.async=tmpEvt.async||false;
}else{
throw new x.EventException(x.EventException.UNSPECIFIED_EVENT_TYPE_ERR);
}}
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){
list.sort(function(a, b){ return b.priority - a.priority; });
args=[].slice.call(arguments);
args.shift();
evt.type=type;
args.unshift(evt);
if(MXI_DEBUG&&Env.debug.events){
Env.log("Event '%s' fired on %u", evt.type, uid);
}
var queue=[];
Basic.each(list, function(handler){
args[0].target=handler.scope;
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(queue.length){
Basic.inSeries(queue, function(err){
result = !err;
});
}}
return result;
},
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);
},
handleEventProps: function(dispatches){
var self=this;
this.bind(dispatches.join(' '), function(e){
var prop='on' + e.type.toLowerCase();
if(Basic.typeOf(this[prop])==='function'){
this[prop].apply(this, arguments);
}});
Basic.each(dispatches, function(prop){
prop='on' + prop.toLowerCase(prop);
if(Basic.typeOf(self[prop])==='undefined'){
self[prop]=null;
}});
}});
}
EventTarget.instance=new EventTarget();
return EventTarget;
});
define('moxie/runtime/Runtime', [
"moxie/core/utils/Env",
"moxie/core/utils/Basic",
"moxie/core/utils/Dom",
"moxie/core/EventTarget"
], function(Env, Basic, Dom, EventTarget){
var runtimeConstructors={}, runtimes={};
function Runtime(options, type, caps, modeCaps, preferredMode){
var self=this
, _shim
, _uid=Basic.guid(type + '_')
, defaultMode=preferredMode||'browser'
;
options=options||{};
runtimes[_uid]=this;
caps=Basic.extend({
access_binary: false,
access_image_binary: false,
display_media: false,
do_cors: false,
drag_and_drop: false,
filter_by_extension: true,
resize_image: false,
report_upload_progress: false,
return_response_headers: false,
return_response_type: false,
return_status_code: true,
send_custom_headers: false,
select_file: false,
select_folder: false,
select_multiple: true,
send_binary_string: false,
send_browser_cookies: true,
send_multipart: true,
slice_blob: false,
stream_upload: false,
summon_file_dialog: false,
upload_filesize: true,
use_http_method: true
}, caps);
if(options.preferred_caps){
defaultMode=Runtime.getMode(modeCaps, options.preferred_caps, defaultMode);
}
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("\tdefault mode: %s", defaultMode);
}
_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);
});
}};}());
Basic.extend(this, {
initialized: false,
uid: _uid,
type: type,
mode: Runtime.getMode(modeCaps, (options.required_caps), defaultMode),
shimid: _uid + '_container',
clients: 0,
options: options,
can: function(cap, value){
var refCaps=arguments[2]||caps;
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;
}
if(Basic.typeOf(refCaps[cap])==='function'){
return refCaps[cap].call(this, value);
}else{
return (value===refCaps[cap]);
}},
getShimContainer: function(){
var container, shimContainer=Dom.get(this.shimid);
if(!shimContainer){
container=this.options.container ? Dom.get(this.options.container):document.body;
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;
},
getShim: function(){
return _shim;
},
shimExec: function(component, action){
var args=[].slice.call(arguments, 2);
return self.getShim().exec.call(this, this.uid, component, action, args);
},
exec: function(component, action){
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);
},
destroy: function(){
if(!self){
return;
}
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;
_uid=self=_shim=shimContainer=null;
}});
if(this.mode&&options.required_caps&&!this.can(options.required_caps)){
this.mode=false;
}}
Runtime.order='html5,html4';
Runtime.getRuntime=function(uid){
return runtimes[uid] ? runtimes[uid]:false;
};
Runtime.addConstructor=function(type, constructor){
constructor.prototype=EventTarget.instance;
runtimeConstructors[type]=constructor;
};
Runtime.getConstructor=function(type){
return runtimeConstructors[type]||null;
};
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;
};
Runtime.parseCaps=function(capStr){
var capObj={};
if(Basic.typeOf(capStr)!=='string'){
return capStr||{};}
Basic.each(capStr.split(','), function(key){
capObj[key]=true;
});
return capObj;
};
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;
};
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;
};
Runtime.getMode=function(modeCaps, requiredCaps, defaultMode){
var mode=null;
if(Basic.typeOf(defaultMode)==='undefined'){
defaultMode='browser';
}
if(requiredCaps&&!Basic.isEmptyObj(modeCaps)){
Basic.each(requiredCaps, function(value, cap){
if(modeCaps.hasOwnProperty(cap)){
var capMode=modeCaps[cap](value);
if(typeof(capMode)==='string'){
capMode=[capMode];
}
if(!mode){
mode=capMode;
}else if(!(mode=Basic.arrayIntersect(mode, capMode))){
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("\t\t%c: %v (conflicting mode requested: %s)", cap, value, capMode);
}
return (mode=false);
}}
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("\t\t%c: %v (compatible modes: %s)", cap, value, mode);
}});
if(mode){
return Basic.inArray(defaultMode, mode)!==-1 ? defaultMode:mode[0];
}else if(mode===false){
return false;
}}
return defaultMode;
};
Runtime.capTrue=function(){
return true;
};
Runtime.capFalse=function(){
return false;
};
Runtime.capTest=function(expr){
return function(){
return !!expr;
};};
return Runtime;
});
define('moxie/runtime/RuntimeClient', [
'moxie/core/utils/Env',
'moxie/core/Exceptions',
'moxie/core/utils/Basic',
'moxie/runtime/Runtime'
], function(Env, x, Basic, Runtime){
return function RuntimeClient(){
var runtime;
Basic.extend(this, {
connectRuntime: function(options){
var comp=this, ruid;
function initialize(items){
var type, constructor;
if(!items.length){
comp.trigger('RuntimeError', new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR));
runtime=null;
return;
}
type=items.shift().toLowerCase();
constructor=Runtime.getConstructor(type);
if(!constructor){
initialize(items);
return;
}
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("Trying runtime: %s", type);
Env.log(options);
}
runtime=new constructor(options);
runtime.bind('Init', function(){
runtime.initialized=true;
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("Runtime '%s' initialized", runtime.type);
}
setTimeout(function(){
runtime.clients++;
comp.trigger('RuntimeInit', runtime);
}, 1);
});
runtime.bind('Error', function(){
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("Runtime '%s' failed to initialize", runtime.type);
}
runtime.destroy();
initialize(items);
});
/*runtime.bind('Exception', function(){ });*/
if(MXI_DEBUG&&Env.debug.runtime){
Env.log("\tselected mode: %s", runtime.mode);
}
if(!runtime.mode){
runtime.trigger('Error');
return;
}
runtime.init();
}
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{
throw new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR);
}}
initialize((options.runtime_order||Runtime.order).split(/\s*,\s*/));
},
disconnectRuntime: function(){
if(runtime&&--runtime.clients <=0){
runtime.destroy();
}
runtime=null;
},
getRuntime: function(){
if(runtime&&runtime.uid){
return runtime;
}
return runtime=null;
},
exec: function(){
if(runtime){
return runtime.exec.apply(this, arguments);
}
return null;
}});
};});
define('moxie/file/FileInput', [
'moxie/core/utils/Basic',
'moxie/core/utils/Env',
'moxie/core/utils/Mime',
'moxie/core/utils/Dom',
'moxie/core/Exceptions',
'moxie/core/EventTarget',
'moxie/core/I18n',
'moxie/runtime/Runtime',
'moxie/runtime/RuntimeClient'
], function(Basic, Env, Mime, Dom, x, EventTarget, I18n, 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
<div id="container">
<a id="file-picker" href="javascript:;">Browse...</a>
</div>
<script>var fileInput=new mOxie.FileInput({
browse_button: 'file-picker',
container: 'container',
accept: [
{title: "Image files", extensions: "jpg,gif,png"}
],
multiple: true
});
fileInput.onchange=function(e){
console.info(e.target.files);
};
fileInput.init();</script>
*/
var dispatches=[
'ready',
'change',
'cancel',
'mouseenter',
'mouseleave',
'mousedown',
'mouseup'
];
function FileInput(options){
if(MXI_DEBUG){
Env.log("Instantiating FileInput...");
}
var self=this,
container, browseButton, defaults;
if(Basic.inArray(Basic.typeOf(options), ['string', 'node'])!==-1){
options={ browse_button:options };}
browseButton=Dom.get(options.browse_button);
if(!browseButton){
throw new x.DOMException(x.DOMException.NOT_FOUND_ERR);
}
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);
if(typeof(options.required_caps)==='string'){
options.required_caps=Runtime.parseCaps(options.required_caps);
}
if(typeof(options.accept)==='string'){
options.accept=Mime.mimes2extList(options.accept);
}
container=Dom.get(options.container);
if(!container){
container=document.body;
}
if(Dom.getStyle(container, 'position')==='static'){
container.style.position='relative';
}
container=browseButton=null;
RuntimeClient.call(self);
Basic.extend(self, {
uid: Basic.guid('uid_'),
ruid: null,
shimid: null,
files: null,
init: function(){
self.bind('RuntimeInit', function(e, runtime){
self.ruid=runtime.uid;
self.shimid=runtime.shimid;
self.bind("Ready", function(){
self.trigger("Refresh");
}, 999);
self.bind('Refresh', function(){
var pos, size, browseButton, shimContainer;
browseButton=Dom.get(options.browse_button);
shimContainer=Dom.get(runtime.shimid);
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);
});
self.connectRuntime(Basic.extend({}, options, {
required_caps: {
select_file: true
}}));
},
disable: function(state){
var runtime=this.getRuntime();
if(runtime){
runtime.exec.call(this, 'FileInput', 'disable', Basic.typeOf(state)==='undefined' ? true:state);
}},
refresh: function(){
self.trigger("Refresh");
},
destroy: function(){
var runtime=this.getRuntime();
if(runtime){
runtime.exec.call(this, 'FileInput', 'destroy');
this.disconnectRuntime();
}
if(Basic.typeOf(this.files)==='array'){
Basic.each(this.files, function(file){
file.destroy();
});
}
this.files=null;
this.unbindAll();
}});
this.handleEventProps(dispatches);
}
FileInput.prototype=EventTarget.instance;
return FileInput;
});
define('moxie/core/utils/Encode', [], function(){
var utf8_encode=function(str){
return unescape(encodeURIComponent(str));
};
var utf8_decode=function(str_data){
return decodeURIComponent(escape(str_data));
};
var atob=function(data, utf8){
if(typeof(window.atob)==='function'){
return utf8 ? utf8_decode(window.atob(data)):window.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 {
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;
};
var btoa=function(data, utf8){
if(utf8){
data=utf8_encode(data);
}
if(typeof(window.btoa)==='function'){
return window.btoa(data);
}
var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i=0,
ac=0,
enc="",
tmp_arr=[];
if(!data){
return data;
}
do {
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;
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
};});
define('moxie/file/Blob', [
'moxie/core/utils/Basic',
'moxie/core/utils/Encode',
'moxie/runtime/RuntimeClient'
], function(Basic, Encode, RuntimeClient){
var blobpool={};
function Blob(ruid, blob){
function _sliceDetached(start, end, type){
var blob, data=blobpool[this.uid];
if(Basic.typeOf(data)!=='string'||!data.length){
return null;
}
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'){
blob={ data: blob };}
Basic.extend(this, {
uid: blob.uid||Basic.guid('uid_'),
ruid: ruid,
size: blob.size||0,
type: blob.type||'',
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);
},
getSource: function(){
if(!blobpool[this.uid]){
return null;
}
return blobpool[this.uid];
},
detach: function(data){
if(this.ruid){
this.getRuntime().exec.call(this, 'Blob', 'destroy');
this.disconnectRuntime();
this.ruid=null;
}
data=data||'';
if(data.substr(0, 5)=='data:'){
var base64Offset=data.indexOf(';base64,');
this.type=data.substring(5, base64Offset);
data=Encode.atob(data.substring(base64Offset + 8));
}
this.size=data.length;
blobpool[this.uid]=data;
},
isDetached: function(){
return !this.ruid&&Basic.typeOf(blobpool[this.uid])==='string';
},
destroy: function(){
this.detach();
delete blobpool[this.uid];
}});
if(blob.data){
this.detach(blob.data);
}else{
blobpool[this.uid]=blob;
}}
return Blob;
});
define('moxie/file/File', [
'moxie/core/utils/Basic',
'moxie/core/utils/Mime',
'moxie/file/Blob'
], function(Basic, Mime, Blob){
function File(ruid, file){
if(!file){
file={};}
Blob.apply(this, arguments);
if(!this.type){
this.type=Mime.getFileMime(file.name);
}
var name;
if(file.name){
name=file.name.replace(/\\/g, '/');
name=name.substr(name.lastIndexOf('/') + 1);
}else if(this.type){
var prefix=this.type.split('/')[0];
name=Basic.guid((prefix!=='' ? prefix:'file') + '_');
if(Mime.extensions[this.type]){
name +='.' + Mime.extensions[this.type][0];
}}
Basic.extend(this, {
name: name||Basic.guid('file_'),
relativePath: '',
lastModifiedDate: file.lastModifiedDate||(new Date()).toLocaleString()
});
}
File.prototype=Blob.prototype;
return File;
});
define('moxie/file/FileDrop', [
'moxie/core/I18n',
'moxie/core/utils/Dom',
'moxie/core/Exceptions',
'moxie/core/utils/Basic',
'moxie/core/utils/Env',
'moxie/file/File',
'moxie/runtime/RuntimeClient',
'moxie/core/EventTarget',
'moxie/core/utils/Mime'
], function(I18n, Dom, x, Basic, Env, 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
<div id="drop_zone">
Drop files here
</div>
<br />
<div id="filelist"></div>
<script type="text/javascript">var fileDrop=new mOxie.FileDrop('drop_zone'), fileList=mOxie.get('filelist');
fileDrop.ondrop=function(){
mOxie.each(this.files, function(file){
fileList.innerHTML +='<div>' + file.name + '</div>';
});
};
fileDrop.init();</script>
@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=[
'ready',
'dragenter',
'dragleave',
'drop',
'error'
];
function FileDrop(options){
if(MXI_DEBUG){
Env.log("Instantiating FileDrop...");
}
var self=this, defaults;
if(typeof(options)==='string'){
options={ drop_zone:options };}
defaults={
accept: [{
title: I18n.translate('All Files'),
extensions: '*'
}],
required_caps: {
drag_and_drop: true
}};
options=typeof(options)==='object' ? Basic.extend({}, defaults, options):defaults;
options.container=Dom.get(options.drop_zone)||document.body;
if(Dom.getStyle(options.container, 'position')==='static'){
options.container.style.position='relative';
}
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.bind('RuntimeInit', function(e, runtime){
self.ruid=runtime.uid;
runtime.exec.call(self, 'FileDrop', 'init', options);
self.dispatchEvent('ready');
});
self.connectRuntime(options);
},
destroy: function(){
var runtime=this.getRuntime();
if(runtime){
runtime.exec.call(this, 'FileDrop', 'destroy');
this.disconnectRuntime();
}
this.files=null;
this.unbindAll();
}});
this.handleEventProps(dispatches);
}
FileDrop.prototype=EventTarget.instance;
return FileDrop;
});
define('moxie/file/FileReader', [
'moxie/core/utils/Basic',
'moxie/core/utils/Encode',
'moxie/core/Exceptions',
'moxie/core/EventTarget',
'moxie/file/Blob',
'moxie/runtime/RuntimeClient'
], function(Basic, Encode, x, EventTarget, Blob, RuntimeClient){
var dispatches=[
'loadstart',
'progress',
'load',
'abort',
'error',
'loadend'
];
function FileReader(){
RuntimeClient.call(this);
Basic.extend(this, {
uid: Basic.guid('uid_'),
readyState: FileReader.EMPTY,
result: null,
error: null,
readAsBinaryString: function(blob){
_read.call(this, 'readAsBinaryString', blob);
},
readAsDataURL: function(blob){
_read.call(this, 'readAsDataURL', blob);
},
readAsText: function(blob){
_read.call(this, 'readAsText', blob);
},
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;
}
this.exec('FileReader', 'abort');
this.trigger('abort');
this.trigger('loadend');
},
destroy: function(){
this.abort();
this.exec('FileReader', 'destroy');
this.disconnectRuntime();
this.unbindAll();
}});
this.handleEventProps(dispatches);
this.bind('Error', function(e, err){
this.readyState=FileReader.DONE;
this.error=err;
}, 999);
this.bind('Load', function(e){
this.readyState=FileReader.DONE;
}, 999);
function _read(op, blob){
var self=this;
this.trigger('loadstart');
if(this.readyState===FileReader.LOADING){
this.trigger('error', new x.DOMException(x.DOMException.INVALID_STATE_ERR));
this.trigger('loadend');
return;
}
if(!(blob instanceof Blob)){
this.trigger('error', new x.DOMException(x.DOMException.NOT_FOUND_ERR));
this.trigger('loadend');
return;
}
this.result=null;
this.readyState=FileReader.LOADING;
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');
this.trigger('loadend');
}else{
this.connectRuntime(blob.ruid);
this.exec('FileReader', 'read', op, blob);
}}
}
FileReader.EMPTY=0;
FileReader.LOADING=1;
FileReader.DONE=2;
FileReader.prototype=EventTarget.instance;
return FileReader;
});
define('moxie/core/utils/Url', [], function(){
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];
}}
if(!uri.scheme){
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='';
if(/^[^\/]/.test(uri.path)){
path=currentUrl.path;
if(/\/[^\/]*\.[^\/]*$/.test(path)){
path=path.replace(/\/[^\/]+$/, '/');
}else{
path=path.replace(/\/?$/, '/');
}}
uri.path=path + (uri.path||'');
}
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;
};
var resolveUrl=function(url){
var ports={
http: 80,
https: 443
}
, urlp=typeof(url)==='object' ? url:parseUrl(url);
;
return urlp.scheme + '://' + urlp.host + (urlp.port!==ports[urlp.scheme] ? ':' + urlp.port:'') + urlp.path + (urlp.query ? urlp.query:'');
};
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
};});
define('moxie/runtime/RuntimeTarget', [
'moxie/core/utils/Basic',
'moxie/runtime/RuntimeClient',
"moxie/core/EventTarget"
], function(Basic, RuntimeClient, EventTarget){
function RuntimeTarget(){
this.uid=Basic.guid('uid_');
RuntimeClient.call(this);
this.destroy=function(){
this.disconnectRuntime();
this.unbindAll();
};}
RuntimeTarget.prototype=EventTarget.instance;
return RuntimeTarget;
});
define('moxie/file/FileReaderSync', [
'moxie/core/utils/Basic',
'moxie/runtime/RuntimeClient',
'moxie/core/utils/Encode'
], function(Basic, RuntimeClient, Encode){
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;
}}
};});
define("moxie/xhr/FormData", [
"moxie/core/Exceptions",
"moxie/core/utils/Basic",
"moxie/file/Blob"
], function(x, Basic, Blob){
function FormData(){
var _blob, _fields=[];
Basic.extend(this, {
append: function(name, value){
var self=this, valueType=Basic.typeOf(value);
if(value instanceof Blob){
_blob={
name: name,
value: value
};}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()
});
}},
hasBlob: function(){
return !!this.getBlob();
},
getBlob: function(){
return _blob&&_blob.value||null;
},
getBlobName: function(){
return _blob&&_blob.name||null;
},
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;
});
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;
var dispatches=[
'loadstart',
'progress',
'abort',
'error',
'load',
'timeout',
'loadend'
];
var NATIVE=1, RUNTIME=2;
function XMLHttpRequest(){
var self=this,
props={
timeout: 0,
readyState: XMLHttpRequest.UNSENT,
withCredentials: false,
status: 0,
statusText: "",
responseType: "",
responseXML: null,
responseText: null,
response: null
},
_async=true,
_url,
_method,
_headers={},
_user,
_password,
_encoding=null,
_mimeType=null,
_sync_flag=false,
_send_flag=false,
_upload_events_flag=false,
_upload_complete_flag=false,
_error_flag=false,
_same_origin_flag=false,
_start_time,
_timeoutset_time,
_finalMime=null,
_finalCharset=null,
_options={},
_xhr,
_responseHeaders='',
_responseHeadersBag
;
Basic.extend(this, props, {
uid: Basic.guid('uid_'),
upload: new XMLHttpRequestUpload(),
open: function(method, url, async, user, password){
var urlp;
if(!method||!url){
throw new x.DOMException(x.DOMException.SYNTAX_ERR);
}
if(/[\u0100-\uffff]/.test(method)||Encode.utf8_encode(method)!==method){
throw new x.DOMException(x.DOMException.SYNTAX_ERR);
}
if(!!~Basic.inArray(method.toUpperCase(), ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'TRACE', 'TRACK'])){
_method=method.toUpperCase();
}
if(!!~Basic.inArray(_method, ['CONNECT', 'TRACE', 'TRACK'])){
throw new x.DOMException(x.DOMException.SECURITY_ERR);
}
url=Encode.utf8_encode(url);
urlp=Url.parseUrl(url);
_same_origin_flag=Url.hasSameOrigin(urlp);
_url=Url.resolveUrl(url);
if((user||password)&&!_same_origin_flag){
throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
}
_user=user||urlp.user;
_password=password||urlp.pass;
_async=async||true;
if(_async===false&&(_p('timeout')||_p('withCredentials')||_p('responseType')!=="")){
throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
}
_sync_flag = !_async;
_send_flag=false;
_headers={};
_reset.call(this);
_p('readyState', XMLHttpRequest.OPENED);
this.dispatchEvent('readystatechange');
},
setRequestHeader: function(header, value){
var uaHeaders=[
"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(_p('readyState')!==XMLHttpRequest.OPENED||_send_flag){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
if(/[\u0100-\uffff]/.test(header)||Encode.utf8_encode(header)!==header){
throw new x.DOMException(x.DOMException.SYNTAX_ERR);
}
/* 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();
if(!!~Basic.inArray(header, uaHeaders)||/^(proxy\-|sec\-)/.test(header)){
return false;
}
if(!_headers[header]){
_headers[header]=value;
}else{
_headers[header] +=', ' + value;
}
return true;
},
getAllResponseHeaders: function(){
return _responseHeaders||'';
},
getResponseHeader: function(header){
header=header.toLowerCase();
if(_error_flag||!!~Basic.inArray(header, ['set-cookie', 'set-cookie2'])){
return null;
}
if(_responseHeaders&&_responseHeaders!==''){
if(!_responseHeadersBag){
_responseHeadersBag={};
Basic.each(_responseHeaders.split(/\r\n/), function(line){
var pair=line.split(/:\s+/);
if(pair.length===2){
pair[0]=Basic.trim(pair[0]);
_responseHeadersBag[pair[0].toLowerCase()]={
header: pair[0],
value: Basic.trim(pair[1])
};}});
}
if(_responseHeadersBag.hasOwnProperty(header)){
return _responseHeadersBag[header].header + ': ' + _responseHeadersBag[header].value;
}}
return null;
},
overrideMimeType: function(mime){
var matches, charset;
if(!!~Basic.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
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);
}
_finalMime=mime;
_finalCharset=charset;
},
send: function(data, options){
if(Basic.typeOf(options)==='string'){
_options={ ruid: options };}else if(!options){
_options={};}else{
_options=options;
}
if(this.readyState!==XMLHttpRequest.OPENED||_send_flag){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
if(data instanceof Blob){
_options.ruid=data.ruid;
_mimeType=data.type||'application/octet-stream';
}
else if(data instanceof FormData){
if(data.hasBlob()){
var blob=data.getBlob();
_options.ruid=blob.ruid;
_mimeType=blob.type||'application/octet-stream';
}}
else if(typeof data==='string'){
_encoding='UTF-8';
_mimeType='text/plain;charset=UTF-8';
data=Encode.utf8_encode(data);
}
if(!this.withCredentials){
this.withCredentials=(_options.required_caps&&_options.required_caps.send_browser_cookies)&&!_same_origin_flag;
}
_upload_events_flag=(!_sync_flag&&this.upload.hasEventListener());
_error_flag=false;
_upload_complete_flag = !data;
if(!_sync_flag){
_send_flag=true;
}
_doXHR.call(this, data);
},
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.handleEventProps(dispatches.concat(['readystatechange']));
this.upload.handleEventProps(dispatches);
/* this is nice, but maybe too lengthy
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);
}
_timeoutset_time=(new Date).getTime();
_p('timeout', value);
}});
o.defineProperty(this, 'withCredentials', {
configurable: false,
get: function(){
return _p('withCredentials');
},
set: function(value){
if(!~o.inArray(_p('readyState'), [XMLHttpRequest.UNSENT, XMLHttpRequest.OPENED])||_send_flag){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
if(_anonymous_flag||_sync_flag){
throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
}
_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){
if(!!~o.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
if(_sync_flag){
throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
}
_p('responseType', value.toLowerCase());
}});
o.defineProperty(this, 'responseText', {
configurable: false,
get: function(){
if(!~o.inArray(_p('responseType'), ['', 'text'])){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
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(){
if(!~o.inArray(_p('responseType'), ['', 'document'])){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
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){
return Env.can('define_property') ? props[prop]:self[prop];
}else{
if(Env.can('define_property')){
props[prop]=value;
}else{
self[prop]=value;
}}
}
function _doXHR(data){
var self=this;
_start_time=new Date().getTime();
_xhr=new RuntimeTarget();
function loadEnd(){
if(_xhr){
_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);
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){
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);
}
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(!Basic.isEmptyObj(_headers)){
_options.required_caps.send_custom_headers=true;
}
if(!_same_origin_flag){
_options.required_caps.do_cors=true;
}
if(_options.ruid){
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;
});
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);
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{
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.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;
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;
});
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){
var dispatches=[
'progress',
'load',
'error',
'resize',
'embedded'
];
function Image(){
RuntimeClient.call(this);
Basic.extend(this, {
uid: Basic.guid('uid_'),
ruid: null,
name: "",
size: 0,
width: 0,
height: 0,
type: "",
meta: {},
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(){
};
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(){
_load.apply(this, arguments);
},
downsize: function(opts){
var defaults={
width: this.width,
height: this.height,
type: this.type||'image/jpeg',
quality: 90,
crop: false,
preserveHeaders: true,
resample: false
};
if(typeof(opts)==='object'){
opts=Basic.extend(defaults, opts);
}else{
opts=Basic.extend(defaults, {
width: arguments[0],
height: arguments[1],
crop: arguments[2],
preserveHeaders: arguments[3]
});
}
try {
if(!this.size){
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);
}
this.exec('Image', 'downsize', opts.width, opts.height, opts.crop, opts.preserveHeaders);
} catch(ex){
this.trigger('error', ex.code);
}},
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');
},
getAsBlob: function(type, quality){
if(!this.size){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
return this.exec('Image', 'getAsBlob', type||'image/jpeg', quality||90);
},
getAsDataURL: function(type, quality){
if(!this.size){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
return this.exec('Image', 'getAsDataURL', type||'image/jpeg', quality||90);
},
getAsBinaryString: function(type, quality){
var dataUrl=this.getAsDataURL(type, quality);
return Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7));
},
embed: function(el, opts){
var self=this
, runtime
;
opts=Basic.extend({
width: this.width,
height: this.height,
type: this.type||'image/jpeg',
quality: 90
}, opts||{});
function render(type, quality){
var img=this;
if(Env.can('create_canvas')){
var canvas=img.getAsCanvas();
if(canvas){
el.appendChild(canvas);
canvas=null;
img.destroy();
self.trigger('embedded');
return;
}}
var dataUrl=img.getAsDataURL(type, quality);
if(!dataUrl){
throw new x.ImageError(x.ImageError.WRONG_FORMAT);
}
if(Env.can('use_data_uri_of', dataUrl.length)){
el.innerHTML='<img src="' + dataUrl + '" width="' + img.width + '" height="' + img.height + '" />';
img.destroy();
self.trigger('embedded');
}else{
var tr=new Transporter();
tr.bind("TransportingComplete", function(){
runtime=self.connectRuntime(this.result.ruid);
self.bind("Embedded", function(){
Basic.extend(runtime.getShimContainer().style, {
top: '0px',
left: '0px',
width: img.width + 'px',
height: img.height + 'px'
});
/*tr.bind("RuntimeInit", function(e, runtime){
tr.destroy();
runtime.destroy();
onResize.call(self);
});*/
runtime=null;
}, 999);
runtime.exec.call(self, "ImageView", "display", this.result.uid, width, height);
img.destroy();
});
tr.transport(Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7)), type, {
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){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
if(this.width > Image.MAX_RESIZE_WIDTH||this.height > Image.MAX_RESIZE_HEIGHT){
}
var imgCopy=new Image();
imgCopy.bind("Resize", function(){
render.call(this, opts.type, opts.quality);
});
imgCopy.bind("Load", function(){
imgCopy.downsize(opts);
});
if(this.meta.thumb&&this.meta.thumb.width >=opts.width&&this.meta.thumb.height >=opts.height){
imgCopy.load(this.meta.thumb.data);
}else{
imgCopy.clone(this, false);
}
return imgCopy;
} catch(ex){
this.trigger('error', ex.code);
}},
destroy: function(){
if(this.ruid){
this.getRuntime().exec.call(this, 'Image', 'destroy');
this.disconnectRuntime();
}
this.unbindAll();
}});
this.handleEventProps(dispatches);
this.bind('Load Resize', function(){
_updateInfo.call(this);
}, 999);
function _updateInfo(info){
if(!info){
info=this.exec('Image', 'getInfo');
}
this.size=info.size;
this.width=info.width;
this.height=info.height;
this.type=info.type;
this.meta=info.meta;
if(this.name===''){
this.name=info.name;
}}
function _load(src){
var srcType=Basic.typeOf(src);
try {
if(src instanceof Image){
if(!src.size){
throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
}
_loadFromImage.apply(this, arguments);
}
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);
}
else if(Basic.inArray(srcType, ['blob', 'file'])!==-1){
_load.call(this, new File(null, src), arguments[1]);
}
else if(srcType==='string'){
if(src.substr(0, 5)==='data:'){
_load.call(this, new Blob(null, { data: src }), arguments[1]);
}else{
_loadFromUrl.apply(this, arguments);
}}
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){
this.trigger('error', ex.code);
}}
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);
});
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);
}}
Image.MAX_RESIZE_WIDTH=8192;
Image.MAX_RESIZE_HEIGHT=8192;
Image.prototype=EventTarget.instance;
return Image;
});
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(){
var div=document.createElement('div');
return (('draggable' in div)||('ondragstart' in div&&'ondrop' in div)) &&
(Env.browser!=='IE'||Env.verComp(Env.version, 9, '>'));
}()),
filter_by_extension: Test(function(){
return (Env.browser==='Chrome'&&Env.verComp(Env.version, 28, '>=')) ||
(Env.browser==='IE'&&Env.verComp(Env.version, 10, '>=')) ||
(Env.browser==='Safari'&&Env.verComp(Env.version, 7, '>='));
}()),
return_response_headers: True,
return_response_type: function(responseType){
if(responseType==='json'&&!!window.JSON){
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.verComp(Env.version, 21, '>=');
},
select_multiple: function(){
return I.can('select_file') &&
!(Env.browser==='Safari'&&Env.os==='Windows') &&
!(Env.os==='iOS'&&Env.verComp(Env.osVersion, "7.0.0", '>')&&Env.verComp(Env.osVersion, "8.0.0", '<'));
},
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: function(){
return I.can('select_file')&&(
(Env.browser==='Firefox'&&Env.verComp(Env.version, 4, '>=')) ||
(Env.browser==='Opera'&&Env.verComp(Env.version, 12, '>=')) ||
(Env.browser==='IE'&&Env.verComp(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){
return function(){
destroy.call(I);
destroy=I = null;
};}(this.destroy))
});
Basic.extend(this.getShim(), extensions);
}
Runtime.addConstructor(type, Html5Runtime);
return extensions;
});
define('moxie/core/utils/Events', [
'moxie/core/utils/Basic'
], function(Basic){
var eventhash={}, uid='moxie_' + Basic.guid();
function preventDefault(){
this.returnValue=false;
}
function stopPropagation(){
this.cancelBubble=true;
}
var addEvent=function(obj, name, callback, key){
var func, events;
name=name.toLowerCase();
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);
}
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,
key: key
});
};
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--){
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!==undef){
break;
}}
}
if(!type.length){
delete eventhash[obj[uid]][name];
}
if(Basic.isEmptyObj(eventhash[obj[uid]])){
delete eventhash[obj[uid]];
try {
delete obj[uid];
} catch(e){
obj[uid]=undef;
}}
};
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
};});
define("moxie/runtime/html5/file/FileInput", [
"moxie/runtime/html5/Runtime",
"moxie/file/File",
"moxie/core/utils/Basic",
"moxie/core/utils/Dom",
"moxie/core/utils/Events",
"moxie/core/utils/Mime",
"moxie/core/utils/Env"
], function(extensions, File, Basic, Dom, Events, Mime, Env){
function FileInput(){
var _options;
Basic.extend(this, {
init: function(options){
var comp=this, I=comp.getRuntime(), input, shimContainer, mimes, browseButton, zIndex, top;
_options=options;
mimes=_options.accept.mimes||Mime.extList2mimes(_options.accept, I.can('filter_by_extension'));
shimContainer=I.getShimContainer();
shimContainer.innerHTML='<input id="' + I.uid +'" type="file" style="font-size:999px;opacity:0;"' +
(_options.multiple&&I.can('select_multiple') ? 'multiple':'') +
(_options.directory&&I.can('select_folder') ? 'webkitdirectory directory':'') +
(mimes ? ' accept="' + mimes.join(',') + '"':'') + ' />';
input=Dom.get(I.uid);
Basic.extend(input.style, {
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%'
});
browseButton=Dom.get(_options.browse_button);
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){
input.click();
}
e.preventDefault();
}, comp.uid);
}
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(e){
comp.files=[];
Basic.each(this.files, function(file){
var relativePath='';
if(_options.directory){
if(file.name=="."){
return true;
}}
if(file.webkitRelativePath){
relativePath='/' + file.webkitRelativePath.replace(/^\//, '');
}
file=new File(I.uid, file);
file.relativePath=relativePath;
comp.files.push(file);
});
if(Env.browser!=='IE'&&Env.browser!=='IEMobile'){
this.value='';
}else{
var clone=this.cloneNode(true);
this.parentNode.replaceChild(clone, this);
clone.onchange=onChange;
}
if(comp.files.length){
comp.trigger('change');
}};
comp.trigger({
type: 'ready',
async: true
});
shimContainer=null;
},
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);
_options=shimContainer=shim=null;
}});
}
return (extensions.FileInput=FileInput);
});
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();
return blob.slice(start, end);
} catch (e){
return blob.slice(start, end - start);
}}else if((blobSlice=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)){
return blobSlice.call(blob, start, end);
}else{
return null;
}}
this.slice=function(){
return new Blob(this.getRuntime().uid, w3cBlobSlice.apply(this, arguments));
};}
return (extensions.Blob=HTML5Blob);
});
define("moxie/runtime/html5/file/FileDrop", [
"moxie/runtime/html5/Runtime",
'moxie/file/File',
"moxie/core/utils/Basic",
"moxie/core/utils/Dom",
"moxie/core/utils/Events",
"moxie/core/utils/Mime"
], function(extensions, File, Basic, Dom, Events, Mime){
function FileDrop(){
var _files=[], _allowedExts=[], _options, _ruid;
Basic.extend(this, {
init: function(options){
var comp=this, dropZone;
_options=options;
_ruid=comp.ruid;
_allowedExts=_extractExts(_options.accept);
dropZone=_options.container;
Events.addEvent(dropZone, 'dragover', function(e){
if(!_hasFiles(e)){
return;
}
e.preventDefault();
e.dataTransfer.dropEffect='copy';
}, comp.uid);
Events.addEvent(dropZone, 'drop', function(e){
if(!_hasFiles(e)){
return;
}
e.preventDefault();
_files=[];
if(e.dataTransfer.items&&e.dataTransfer.items[0].webkitGetAsEntry){
_readItems(e.dataTransfer.items, function(){
comp.files=_files;
comp.trigger("drop");
});
}else{
Basic.each(e.dataTransfer.files, function(file){
_addFile(file);
});
comp.files=_files;
comp.trigger("drop");
}}, comp.uid);
Events.addEvent(dropZone, 'dragenter', function(e){
comp.trigger("dragenter");
}, comp.uid);
Events.addEvent(dropZone, 'dragleave', function(e){
comp.trigger("dragleave");
}, comp.uid);
},
destroy: function(){
Events.removeAllEvents(_options&&Dom.get(_options.container), this.uid);
_ruid=_files=_allowedExts=_options=null;
}});
function _hasFiles(e){
if(!e.dataTransfer||!e.dataTransfer.types){
return false;
}
var types=Basic.toArray(e.dataTransfer.types||[]);
return Basic.inArray("Files", types)!==-1 ||
Basic.inArray("public.file-url", types)!==-1 ||
Basic.inArray("application/x-moz-file", types)!==-1 
;
}
function _addFile(file, relativePath){
if(_isAcceptable(file)){
var fileObj=new File(_ruid, file);
fileObj.relativePath=relativePath||'';
_files.push(fileObj);
}}
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){
if(!_allowedExts.length){
return true;
}
var ext=Mime.getFileExtension(file.name);
return !ext||Basic.inArray(ext, _allowedExts)!==-1;
}
function _readItems(items, cb){
var entries=[];
Basic.each(items, function(item){
var entry=item.webkitGetAsEntry();
if(entry){
if(entry.isFile){
_addFile(item.getAsFile(), entry.fullPath);
}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){
_addFile(file, entry.fullPath);
cb();
}, function(){
cb();
});
}else if(entry.isDirectory){
_readDirEntry(entry, cb);
}else{
cb();
}}
function _readDirEntry(dirEntry, cb){
var entries=[], dirReader=dirEntry.createReader();
function getEntries(cbcb){
dirReader.readEntries(function(moreEntries){
if(moreEntries.length){
[].push.apply(entries, moreEntries);
getEntries(cbcb);
}else{
cbcb();
}}, cbcb);
}
getEntries(function(){
_readEntries(entries, cb);
});
}}
return (extensions.FileDrop=FileDrop);
});
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 comp=this;
comp.result='';
_fr=new window.FileReader();
_fr.addEventListener('progress', function(e){
comp.trigger(e);
});
_fr.addEventListener('load', function(e){
comp.result=_convertToBinary ? _toBinary(_fr.result):_fr.result;
comp.trigger(e);
});
_fr.addEventListener('error', function(e){
comp.trigger(e, _fr.error);
});
_fr.addEventListener('loadend', function(e){
_fr=null;
comp.trigger(e);
});
if(Basic.typeOf(_fr[op])==='function'){
_convertToBinary=false;
_fr[op](blob.getSource());
}else if(op==='readAsBinaryString'){
_convertToBinary=true;
_fr.readAsDataURL(blob.getSource());
}},
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);
});
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.verComp(Env.version, 4, '>=')&&Env.verComp(Env.version, 7, '<'))
, isAndroidBrowser=Env.browser==='Android Browser'
, mustSendAsBinary=false
;
_filename=meta.url.replace(/^.+?\/([\w\-\.]+)$/, '$1').toLowerCase();
_xhr=_getNativeXHR();
_xhr.open(meta.method, meta.url, meta.async, meta.user, meta.password);
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);
mustSendAsBinary=true;
}else if((isGecko2_5_6||isAndroidBrowser)&&Basic.typeOf(data.getBlob().getSource())==='blob'&&window.FileReader){
_preloadAndSend.call(target, meta, data);
return;
}}
if(data instanceof FormData){
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.upload){
if(meta.withCredentials){
_xhr.withCredentials=true;
}
_xhr.addEventListener('load', function(e){
target.trigger(e);
});
_xhr.addEventListener('error', function(e){
target.trigger(e);
});
_xhr.addEventListener('progress', function(e){
target.trigger(e);
});
_xhr.upload.addEventListener('progress', function(e){
target.trigger({
type: 'UploadProgress',
loaded: e.loaded,
total: e.total
});
});
}else{
_xhr.onreadystatechange=function onReadyStateChange(){
switch (_xhr.readyState){
case 1:
break;
case 2:
break;
case 3:
var total, loaded;
try {
if(Url.hasSameOrigin(meta.url)){
total=_xhr.getResponseHeader('Content-Length')||0;
}
if(_xhr.responseText){
loaded=_xhr.responseText.length;
}} catch(ex){
total=loaded=0;
}
target.trigger({
type: 'progress',
lengthComputable: !!total,
total: parseInt(total, 10),
loaded: loaded
});
break;
case 4:
_xhr.onreadystatechange=function(){};
if(_xhr.status===0){
target.trigger('error');
}else{
target.trigger('load');
}
break;
}};}
if(!Basic.isEmptyObj(meta.headers)){
Basic.each(meta.headers, function(value, header){
_xhr.setRequestHeader(header, value);
});
}
if(""!==meta.responseType&&'responseType' in _xhr){
if('json'===meta.responseType&&!Env.can('return_response_type', 'json')){
_xhr.responseType='text';
}else{
_xhr.responseType=meta.responseType;
}}
if(!mustSendAsBinary){
_xhr.send(data);
}else{
if(_xhr.sendAsBinary){
_xhr.sendAsBinary(data);
}else{
(function(){
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(){
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);
var disposition=_xhr.getResponseHeader('Content-Disposition');
if(disposition){
var match=disposition.match(/filename=([\'\"'])([^\1]+)\1/);
if(match){
_filename=match[2];
}}
file.name=_filename;
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;
}} catch(ex){
return null;
}},
getAllResponseHeaders: function(){
try {
return _xhr.getAllResponseHeaders();
} catch(ex){}
return '';
},
abort: function(){
if(_xhr){
_xhr.abort();
}},
destroy: function(){
self=_filename=null;
}});
function _preloadAndSend(meta, data){
var target=this, blob, fr;
blob=data.getBlob().getSource();
fr=new window.FileReader();
fr.onload=function(){
data.append(data.getBlobName(), new Blob(null, {
type: blob.type,
data: fr.result
}));
self.send.call(target, meta, data);
};
fr.readAsBinaryString(blob);
}
function _getNativeXHR(){
if(window.XMLHttpRequest&&!(Env.browser==='IE'&&Env.verComp(Env.version, 8, '<'))){
return new window.XMLHttpRequest();
}else{
return (function(){
var progIDs=['Msxml2.XMLHTTP.6.0', 'Microsoft.XMLHTTP'];
for (var i=0; i < progIDs.length; i++){
try {
return new ActiveXObject(progIDs[i]);
} catch (ex){}}
})();
}}
function _getDocument(xhr){
var rXML=xhr.responseXML;
var rText=xhr.responseText;
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);
}
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);
fd.each(function(value, name){
if(value instanceof 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);
});
define("moxie/runtime/html5/utils/BinaryReader", [
"moxie/core/utils/Basic"
], function(Basic){
function BinaryReader(data){
if(data instanceof ArrayBuffer){
ArrayBufferReader.apply(this, arguments);
}else{
UTF16StringReader.apply(this, arguments);
}}
Basic.extend(BinaryReader.prototype, {
littleEndian: false,
read: function(idx, size){
var sum, mv, i;
if(idx + size > this.length()){
throw new Error("You are trying to read outside the source boundaries.");
}
mv=this.littleEndian
? 0 
: -8 * (size - 1)
;
for (i=0, sum=0; i < size; i++){
sum |=(this.readByteAt(idx + i) << Math.abs(mv + i*8));
}
return sum;
},
write: function(idx, num, size){
var mv, i, str='';
if(idx > this.length()){
throw new Error("You are trying to write outside the source boundaries.");
}
mv=this.littleEndian
? 0 
: -8 * (size - 1)
;
for (i=0; i < size; i++){
this.writeByteAt(idx + i, (num >> Math.abs(mv + i*8)) & 255);
}},
BYTE: function(idx){
return this.read(idx, 1);
},
SHORT: function(idx){
return this.read(idx, 2);
},
LONG: function(idx){
return this.read(idx, 4);
},
SLONG: function(idx){
var num=this.read(idx, 4);
return (num > 2147483647 ? num - 4294967296:num);
},
CHAR: function(idx){
return String.fromCharCode(this.read(idx, 1));
},
STRING: function(idx, count){
return this.asArray('CHAR', idx, count).join('');
},
asArray: function(type, idx, count){
var values=[];
for (var i=0; i < count; i++){
values[i]=this[type](idx + i);
}
return values;
}});
function ArrayBufferReader(data){
var _dv=new DataView(data);
Basic.extend(this, {
readByteAt: function(idx){
return _dv.getUint8(idx);
},
writeByteAt: function(idx, value){
_dv.setUint8(idx, value);
},
SEGMENT: function(idx, size, value){
switch (arguments.length){
case 2:
return data.slice(idx, idx + size);
case 1:
return data.slice(idx);
case 3:
if(value===null){
value=new ArrayBuffer();
}
if(value instanceof ArrayBuffer){
var arr=new Uint8Array(this.length() - size + value.byteLength);
if(idx > 0){
arr.set(new Uint8Array(data.slice(0, idx)), 0);
}
arr.set(new Uint8Array(value), idx);
arr.set(new Uint8Array(data.slice(idx + size)), idx + value.byteLength);
this.clear();
data=arr.buffer;
_dv=new DataView(data);
break;
}
default: return data;
}},
length: function(){
return data ? data.byteLength:0;
},
clear: function(){
_dv=data=null;
}});
}
function UTF16StringReader(data){
Basic.extend(this, {
readByteAt: function(idx){
return data.charCodeAt(idx);
},
writeByteAt: function(idx, value){
putstr(String.fromCharCode(value), idx, 1);
},
SEGMENT: function(idx, length, segment){
switch (arguments.length){
case 1:
return data.substr(idx);
case 2:
return data.substr(idx, length);
case 3:
putstr(segment!==null ? segment:'', idx, length);
break;
default: return data;
}},
length: function(){
return data ? data.length:0;
},
clear: function(){
data=null;
}});
function putstr(segment, idx, length){
length=arguments.length===3 ? length:data.length - idx - 1;
data=data.substr(0, idx) + segment + data.substr(length + idx);
}}
return BinaryReader;
});
define("moxie/runtime/html5/image/JPEGHeaders", [
"moxie/runtime/html5/utils/BinaryReader",
"moxie/core/Exceptions"
], function(BinaryReader, x){
return function JPEGHeaders(data){
var headers=[], _br, idx, marker, length=0;
_br=new BinaryReader(data);
if(_br.SHORT(0)!==0xFFD8){
_br.clear();
throw new x.ImageError(x.ImageError.WRONG_FORMAT);
}
idx=2;
while (idx <=_br.length()){
marker=_br.SHORT(idx);
if(marker >=0xFFD0&&marker <=0xFFD7){
idx +=2;
continue;
}
if(marker===0xFFDA||marker===0xFFD9){
break;
}
length=_br.SHORT(idx + 2) + 2;
if(marker >=0xFFE1&&marker <=0xFFEF){
headers.push({
hex: marker,
name: 'APP' + (marker & 0x000F),
start: idx,
length: length,
segment: _br.SEGMENT(idx, length)
});
}
idx +=length;
}
_br.clear();
return {
headers: headers,
restore: function(data){
var max, i, br;
br=new BinaryReader(data);
idx=br.SHORT(2)==0xFFE0 ? 4 + br.SHORT(4):2;
for (i=0, max=headers.length; i < max; i++){
br.SEGMENT(idx, 0, headers[i].segment);
idx +=headers[i].length;
}
data=br.SEGMENT();
br.clear();
return data;
},
strip: function(data){
var br, headers, jpegHeaders, i;
jpegHeaders=new JPEGHeaders(data);
headers=jpegHeaders.headers;
jpegHeaders.purge();
br=new BinaryReader(data);
i=headers.length;
while (i--){
br.SEGMENT(headers[i].start, headers[i].length, '');
}
data=br.SEGMENT();
br.clear();
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(){
this.headers=headers=[];
}};};
});
define("moxie/runtime/html5/image/ExifParser", [
"moxie/core/utils/Basic",
"moxie/runtime/html5/utils/BinaryReader",
"moxie/core/Exceptions"
], function(Basic, BinaryReader, x){
function ExifParser(data){
var __super__, tags, tagDescs, offsets, idx, Tiff;
BinaryReader.call(this, data);
tags={
tiff: {
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'
},
thumb: {
0x0201: 'JPEGInterchangeFormat',
0x0202: 'JPEGInterchangeFormatLength'
}};
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'
},
'GPSLatitudeRef': {
N: 'North latitude',
S: 'South latitude'
},
'GPSLongitudeRef': {
E: 'East longitude',
W: 'West longitude'
}};
offsets={
tiffHeader: 10
};
idx=offsets.tiffHeader;
__super__={
clear: this.clear
};
Basic.extend(this, {
read: function(){
try {
return ExifParser.prototype.read.apply(this, arguments);
} catch (ex){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}},
write: function(){
try {
return ExifParser.prototype.write.apply(this, arguments);
} catch (ex){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}},
UNDEFINED: function(){
return this.BYTE.apply(this, arguments);
},
RATIONAL: function(idx){
return this.LONG(idx) / this.LONG(idx + 4)
},
SRATIONAL: function(idx){
return this.SLONG(idx) / this.SLONG(idx + 4)
},
ASCII: function(idx){
return this.CHAR(idx);
},
TIFF: function(){
return Tiff||null;
},
EXIF: function(){
var Exif=null;
if(offsets.exifIFD){
try {
Exif=extractTags.call(this, offsets.exifIFD, tags.exif);
} catch(ex){
return null;
}
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=null;
if(offsets.gpsIFD){
try {
GPS=extractTags.call(this, offsets.gpsIFD, tags.gps);
} catch (ex){
return null;
}
if(GPS.GPSVersionID&&Basic.typeOf(GPS.GPSVersionID)==='array'){
GPS.GPSVersionID=GPS.GPSVersionID.join('.');
}}
return GPS;
},
thumb: function(){
if(offsets.IFD1){
try {
var IFD1Tags=extractTags.call(this, offsets.IFD1, tags.thumb);
if('JPEGInterchangeFormat' in IFD1Tags){
return this.SEGMENT(offsets.tiffHeader + IFD1Tags.JPEGInterchangeFormat, IFD1Tags.JPEGInterchangeFormatLength);
}} catch (ex){}}
return null;
},
setExif: function(tag, value){
if(tag!=='PixelXDimension'&&tag!=='PixelYDimension'){ return false; }
return setTag.call(this, 'exif', tag, value);
},
clear: function(){
__super__.clear();
data=tags=tagDescs=Tiff=offsets=__super__=null;
}});
if(this.SHORT(0)!==0xFFE1||this.STRING(4, 5).toUpperCase()!=="EXIF\0"){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}
this.littleEndian=(this.SHORT(idx)==0x4949);
if(this.SHORT(idx+=2)!==0x002A){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}
offsets.IFD0=offsets.tiffHeader + this.LONG(idx +=2);
Tiff=extractTags.call(this, 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;
}
if(Basic.isEmptyObj(Tiff)){
Tiff=null;
}
var IFD1Offset=this.LONG(offsets.IFD0 + this.SHORT(offsets.IFD0) * 12 + 2);
if(IFD1Offset){
offsets.IFD1=offsets.tiffHeader + IFD1Offset;
}
function extractTags(IFD_offset, tags2extract){
var data=this;
var length, i, tag, type, count, size, offset, value, values=[], hash={};
var types={
1:'BYTE',
7:'UNDEFINED',
2:'ASCII',
3:'SHORT',
4:'LONG',
5:'RATIONAL',
9:'SLONG',
10: 'SRATIONAL'
};
var sizes={
'BYTE':1,
'UNDEFINED':1,
'ASCII':1,
'SHORT':2,
'LONG':4,
'RATIONAL':8,
'SLONG':4,
'SRATIONAL':8
};
length=data.SHORT(IFD_offset);
for (i=0; i < length; i++){
values=[];
offset=IFD_offset + 2 + i*12;
tag=tags2extract[data.SHORT(offset)];
if(tag===undefined){
continue;
}
type=types[data.SHORT(offset+=2)];
count=data.LONG(offset+=2);
size=sizes[type];
if(!size){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}
offset +=4;
if(size * count > 4){
offset=data.LONG(offset) + offsets.tiffHeader;
}
if(offset + size * count >=this.length()){
throw new x.ImageError(x.ImageError.INVALID_META_ERR);
}
if(type==='ASCII'){
hash[tag]=Basic.trim(data.STRING(offset, count).replace(/\0$/, ''));
continue;
}else{
values=data.asArray(type, offset, count);
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 setTag(ifd, tag, value){
var offset, length, tagOffset, valueOffset=0;
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=this.SHORT(offset);
for (var i=0; i < length; i++){
tagOffset=offset + 12 * i + 2;
if(this.SHORT(tagOffset)==tag){
valueOffset=tagOffset + 8;
break;
}}
if(!valueOffset){
return false;
}
try {
this.write(valueOffset, value, 4);
} catch(ex){
return false;
}
return true;
}}
ExifParser.prototype=BinaryReader.prototype;
return ExifParser;
});
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(data){
var _br, _hm, _ep, _info;
_br=new BinaryReader(data);
if(_br.SHORT(0)!==0xFFD8){
throw new x.ImageError(x.ImageError.WRONG_FORMAT);
}
_hm=new JPEGHeaders(data);
try {
_ep=new ExifParser(_hm.get('app1')[0]);
} catch(ex){}
_info=_getDimensions.call(this);
Basic.extend(this, {
type: 'image/jpeg',
size: _br.length(),
width: _info&&_info.width||0,
height: _info&&_info.height||0,
setExif: function(tag, value){
if(!_ep){
return false;
}
if(Basic.typeOf(tag)==='object'){
Basic.each(tag, function(value, tag){
_ep.setExif(tag, value);
});
}else{
_ep.setExif(tag, value);
}
_hm.set('app1', _ep.SEGMENT());
},
writeHeaders: function(){
if(!arguments.length){
return _hm.restore(data);
}
return _hm.restore(arguments[0]);
},
stripHeaders: function(data){
return _hm.strip(data);
},
purge: function(){
_purge.call(this);
}});
if(_ep){
this.meta={
tiff: _ep.TIFF(),
exif: _ep.EXIF(),
gps: _ep.GPS(),
thumb: _getThumb()
};}
function _getDimensions(br){
var idx=0
, marker
, length
;
if(!br){
br=_br;
}
while (idx <=br.length()){
marker=br.SHORT(idx +=2);
if(marker >=0xFFC0&&marker <=0xFFC3){
idx +=5;
return {
height: br.SHORT(idx),
width: br.SHORT(idx +=2)
};}
length=br.SHORT(idx +=2);
idx +=length - 2;
}
return null;
}
function _getThumb(){
var data=_ep.thumb()
, br
, info
;
if(data){
br=new BinaryReader(data);
info=_getDimensions(br);
br.clear();
if(info){
info.data=data;
return info;
}}
return null;
}
function _purge(){
if(!_ep||!_hm||!_br){
return;
}
_ep.clear();
_hm.purge();
_br.clear();
_info=_hm=_ep=_br=null;
}}
return JPEG;
});
define("moxie/runtime/html5/image/PNG", [
"moxie/core/Exceptions",
"moxie/core/utils/Basic",
"moxie/runtime/html5/utils/BinaryReader"
], function(x, Basic, BinaryReader){
function PNG(data){
var _br, _hm, _ep, _info;
_br=new BinaryReader(data);
(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;
}
_br.clear();
data=_info=_hm=_ep=_br=null;
}
_info=_getDimensions.call(this);
Basic.extend(this, {
type: 'image/png',
size: _br.length(),
width: _info.width,
height: _info.height,
purge: function(){
_purge.call(this);
}});
_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;
});
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){
return function(data){
var _cs=[JPEG, PNG], _img;
_img=(function(){
for (var i=0; i < _cs.length; i++){
try {
return new _cs[i](data);
} catch (ex){
}}
throw new x.ImageError(x.ImageError.WRONG_FORMAT);
}());
Basic.extend(this, {
type: '',
size: 0,
width: 0,
height: 0,
setExif: function(){},
writeHeaders: function(data){
return data;
},
stripHeaders: function(data){
return data;
},
purge: function(){
data=null;
}});
Basic.extend(this, _img);
this.purge=function(){
_img.purge();
_img=null;
};};
});
define("moxie/runtime/html5/image/MegaPixel", [], function(){
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;
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;
}
function detectSubsampling(img){
var iw=img.naturalWidth, ih=img.naturalHeight;
if(iw * ih > 1024 * 1024){
var canvas=document.createElement('canvas');
canvas.width=canvas.height=1;
var ctx=canvas.getContext('2d');
ctx.drawImage(img, -iw + 1, 0);
return ctx.getImageData(0, 0, 1, 1).data[3]===0;
}else{
return false;
}}
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;
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
};});
define("moxie/runtime/html5/image/Image", [
"moxie/runtime/html5/Runtime",
"moxie/core/utils/Basic",
"moxie/core/Exceptions",
"moxie/core/utils/Encode",
"moxie/file/Blob",
"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, Blob, File, ImageInfo, MegaPixel, Mime, Env){
function HTML5Image(){
var me=this
, _img, _imgInfo, _canvas, _binStr, _blob
, _modified=false
, _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||{}};
if(info.meta&&info.meta.thumb&&!(info.meta.thumb.data instanceof Blob)){
info.meta.thumb.data=new Blob(null, {
type: 'image/jpeg',
data: info.meta.thumb.data
});
}
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){
_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(!_modified){
return _img.src;
}
if('image/jpeg'!==type){
return _canvas.toDataURL('image/png');
}else{
try {
return _canvas.toDataURL('image/jpeg', quality/100);
} catch (ex){
return _canvas.toDataURL('image/jpeg');
}}
},
getAsBinaryString: function(type, quality){
if(!_modified){
if(!_binStr){
_binStr=_toBinary(me.getAsDataURL(type, quality));
}
return _binStr;
}
if('image/jpeg'!==type){
_binStr=_toBinary(me.getAsDataURL(type, quality));
}else{
var dataUrl;
if(!quality){
quality=90;
}
try {
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){
if(_imgInfo.meta&&_imgInfo.meta.exif){
_imgInfo.setExif({
PixelXDimension: this.width,
PixelYDimension: this.height
});
}
_binStr=_imgInfo.writeHeaders(_binStr);
}
_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', x.ImageError.WRONG_FORMAT);
};
_img.onload=function(){
comp.trigger('load');
};
_img.src=str.substr(0, 5)=='data:' ? str:_toDataUrl(str, _blob.type);
}
function _readAsDataUrl(file, callback){
var comp=this, fr;
if(window.FileReader){
fr=new FileReader();
fr.onload=function(){
callback(this.result);
};
fr.onerror=function(){
comp.trigger('error', x.ImageError.WRONG_FORMAT);
};
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;
orientation=(this.meta&&this.meta.tiff&&this.meta.tiff.Orientation)||1;
if(Basic.inArray(orientation, [5,6,7,8])!==-1){
var tmp=width;
width=height;
height=tmp;
}
img=_getImg();
if(!crop){
scale=Math.min(width/img.width, height/img.height);
}else{
width=Math.min(width, img.width);
height=Math.min(height, img.height);
scale=Math.max(width/img.width, height/img.height);
}
if(scale > 1&&!crop&&preserveHeaders){
this.trigger('Resize');
return;
}
if(!_canvas){
_canvas=document.createElement("canvas");
}
destWidth=Math.round(img.width * scale);
destHeight=Math.round(img.height * scale);
if(crop){
_canvas.width=width;
_canvas.height=height;
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;
}
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'){
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);
}}
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;
}
var ctx=_canvas.getContext('2d');
switch (orientation){
case 2:
ctx.translate(width, 0);
ctx.scale(-1, 1);
break;
case 3:
ctx.translate(width, height);
ctx.rotate(Math.PI);
break;
case 4:
ctx.translate(0, height);
ctx.scale(1, -1);
break;
case 5:
ctx.rotate(0.5 * Math.PI);
ctx.scale(1, -1);
break;
case 6:
ctx.rotate(0.5 * Math.PI);
ctx.translate(0, -height);
break;
case 7:
ctx.rotate(0.5 * Math.PI);
ctx.translate(width, -height);
ctx.scale(-1, 1);
break;
case 8:
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);
});
define("moxie/runtime/flash/Runtime", [
], function(){
return {};});
define("moxie/runtime/silverlight/Runtime", [
], function(){
return {};});
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(){
return (Env.browser==='Chrome'&&Env.verComp(Env.version, 28, '>=')) ||
(Env.browser==='IE'&&Env.verComp(Env.version, 10, '>=')) ||
(Env.browser==='Safari'&&Env.verComp(Env.version, 7, '>='));
}()),
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: function(){
return I.can('select_file')&&(
(Env.browser==='Firefox'&&Env.verComp(Env.version, 4, '>=')) ||
(Env.browser==='Opera'&&Env.verComp(Env.version, 12, '>=')) ||
(Env.browser==='IE'&&Env.verComp(Env.version, 10, '>=')) ||
!!~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){
return function(){
destroy.call(I);
destroy=I = null;
};}(this.destroy))
});
Basic.extend(this.getShim(), extensions);
}
Runtime.addConstructor(type, Html4Runtime);
return extensions;
});
define("moxie/runtime/html4/file/FileInput", [
"moxie/runtime/html4/Runtime",
"moxie/file/File",
"moxie/core/utils/Basic",
"moxie/core/utils/Dom",
"moxie/core/utils/Events",
"moxie/core/utils/Mime",
"moxie/core/utils/Env"
], function(extensions, File, Basic, Dom, Events, Mime, Env){
function FileInput(){
var _uid, _mimes=[], _options;
function addInput(){
var comp=this, I=comp.getRuntime(), shimContainer, browseButton, currForm, form, input, uid;
uid=Basic.guid('uid_');
shimContainer=I.getShimContainer();
if(_uid){
currForm=Dom.get(_uid + '_form');
if(currForm){
Basic.extend(currForm.style, { top: '100%' });
}}
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);
Basic.extend(input.style, {
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%'
});
if(Env.browser==='IE'&&Env.verComp(Env.version, 10, '<')){
Basic.extend(input.style, {
filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"
});
}
input.onchange=function(){
var file;
if(!this.value){
return;
}
if(this.files){
file=this.files[0];
if(file.size===0){
form.parentNode.removeChild(form);
return;
}}else{
file={
name: this.value
};}
file=new File(I.uid, file);
this.onchange=function(){};
addInput.call(comp);
comp.files=[file];
input.setAttribute('id', file.uid);
form.setAttribute('id', file.uid + '_form');
comp.trigger('change');
input=form=null;
};
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){
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;
_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);
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;
}
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;
comp.trigger({
type: 'ready',
async: true
});
},
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=_mimes=_options=shimContainer=shim=null;
}});
}
return (extensions.FileInput=FileInput);
});
define("moxie/runtime/html4/file/FileReader", [
"moxie/runtime/html4/Runtime",
"moxie/runtime/html5/file/FileReader"
], function(extensions, FileReader){
return (extensions.FileReader=FileReader);
});
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;
break;
}}
inputs=[];
if(!hasFile){
form.parentNode.removeChild(form);
}
form=null;
}
setTimeout(function(){
Events.removeEvent(_iframe, 'load', target.uid);
if(_iframe.parentNode){
_iframe.parentNode.removeChild(_iframe);
}
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')
;
temp.innerHTML='<iframe id="' + uid + '_iframe" name="' + uid + '_iframe" src="javascript:&quot;&quot;" style="display:none"></iframe>';
_iframe=temp.firstChild;
container.appendChild(_iframe);
/* _iframe.onreadystatechange=function(){
console.info(_iframe.readyState);
};*/
Events.addEvent(_iframe, 'load', function(){
var el;
try {
el=_iframe.contentWindow.document||_iframe.contentDocument||window.frames[_iframe.id].document;
if(/^4(0[0-9]|1[0-7]|2[2346])\s/.test(el.title)){
_status=el.title.replace(/^(\d+).*$/, '$1');
}else{
_status=200;
_response=Basic.trim(el.body.innerHTML);
target.trigger({
type: 'progress',
loaded: _response.length,
total: _response.length
});
if(blob){
target.trigger({
type: 'uploadprogress',
loaded: blob.size||1025,
total: blob.size||1025
});
}}
} catch (ex){
if(Url.hasSameOrigin(meta.url)){
_status=404;
}else{
cleanup.call(target, function(){
target.trigger('error');
});
return;
}}
cleanup.call(target, function(){
target.trigger('load');
});
}, target.uid);
}
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');
I.getShimContainer().appendChild(form);
}
form.setAttribute('target', uid + '_iframe');
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
});
if(input){
form.insertBefore(hidden, input);
}else{
form.appendChild(hidden);
}}
});
}
form.setAttribute("action", meta.url);
createIframe();
form.submit();
target.trigger('loadstart');
},
getStatus: function(){
return _status;
},
getResponse: function(responseType){
if('json'===responseType){
if(Basic.typeOf(_response)==='string'&&!!window.JSON){
try {
return JSON.parse(_response.replace(/^\s*<pre[^>]*>/, '').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){
_iframe.contentWindow.stop();
}else if(_iframe.contentWindow.document.execCommand){
_iframe.contentWindow.document.execCommand ('Stop');
}else{
_iframe.src="about:blank";
}}
cleanup.call(this, function(){
target.dispatchEvent('abort');
});
}});
}
return (extensions.XMLHttpRequest=XMLHttpRequest);
});
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/utils/Env","moxie/core/I18n","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/FileInput","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/runtime/Transporter","moxie/image/Image","moxie/core/utils/Events"]);
})(this);
(function(exports){
"use strict";
var o={}, inArray=exports.moxie.core.utils.Basic.inArray;
(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];
}}
})(exports.moxie);
o.Env=exports.moxie.core.utils.Env;
o.Mime=exports.moxie.core.utils.Mime;
o.Exceptions=exports.moxie.core.Exceptions;
exports.mOxie=o;
if(!exports.o){
exports.o=o;
}
return o;
})(this);