objj-runtime
Version:
JavaScript (ECMAScript) and Objective-J runtime
1,238 lines • 210 kB
JavaScript
(function(mod)
{
if (typeof exports == "object" && typeof module == "object")
return mod(exports, require("objj-transpiler"));
if (typeof define == "function" && define.amd)
return define(["exports", "objj-transpiler"], mod);
mod(this.objJRuntime || (this.objJRuntime = {}), ObjJCompiler);
})(function(exports, ObjJCompiler)
{
var NODEFILE = require("fs");
var PATH = require("path");
var sprintf = (require("./printf")).sprintf;
exports.term = require("./term");
var window = exports.window = (require("./browser")).window;
window.OBJJ_HOME = exports.OBJJ_HOME = PATH.resolve(module.parent.filename, "../..");
var defaultFrameworksPath = PATH.join(window.OBJJ_HOME, "Frameworks");
var frameworksPath = PATH.join(process.cwd(), "Frameworks");
var includepaths = [defaultFrameworksPath];
if (defaultFrameworksPath !== frameworksPath)
includepaths.unshift(frameworksPath);
var OBJJ_INCLUDE_PATHS = global.OBJJ_INCLUDE_PATHS = exports.OBJJ_INCLUDE_PATHS = includepaths;
var print = console.log;
var BuiltinModule = require("module");
var Module = module.constructor.length > 1 ? module.constructor : BuiltinModule;
Module._extensions['.j'] = function objJLoader(mod, filename)
{
return objj_importFile(filename, YES);
};
if (!Object.create)
{
Object.create = function(o)
{
if (arguments.length > 1)
throw new Error('Object.create implementation only accepts the first parameter.');
function F()
{
}
F.prototype = o;
return new F();
};
} if (!Object.keys)
{
Object.keys = ( function()
{
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString: null}.propertyIsEnumerable('toString'),
dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],
dontEnumsLength = dontEnums.length;
return function(obj)
{
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null)
throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj)
{
if (hasOwnProperty.call(obj, prop))
result.push(prop);
} if (hasDontEnumBug)
{
for (var i = 0; i < dontEnumsLength; i++)
{
if (hasOwnProperty.call(obj, dontEnums[i]))
result.push(dontEnums[i]);
} } return result;
};
})();
} if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(searchElement)
{
"use strict";
if (this === null)
throw new TypeError();
var t = new Object(this),
len = t.length >>> 0;
if (len === 0)
return -1;
var n = 0;
if (arguments.length > 1)
{
n = Number(arguments[1]);
if (n != n)
n = 0;
else if (n !== 0 && n != Infinity && n != -Infinity)
n = (n > 0 || -1) * Math.floor(Math.abs(n));
} if (n >= len)
return -1;
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++)
{
if (k in t && t[k] === searchElement)
return k;
} return -1;
};
} if (!String.prototype.startsWith)
{
String.prototype.startsWith = function(searchString, position)
{
position = position || 0;
return this.substr(position, searchString.length) === searchString;
};
} if (!String.prototype.endsWith)
{
String.prototype.endsWith = function(searchString, position)
{
var subjectString = this.toString();
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length)
{
position = subjectString.length;
} position -= searchString.length;
var lastIndex = subjectString.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
} if (!this.JSON)
{
JSON = {};
} ( function()
{
function f(n)
{
return n < 10 ? '0' + n : n;
}
if (typeof Date.prototype.toJSON !== 'function')
{
Date.prototype.toJSON = function(key)
{
return this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z';
};
String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function(key)
{
return this.valueOf();
};
} var cx = new RegExp('[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]', "g");
var escapable = new RegExp('[\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]', "g");
var gap,
indent,
meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\'},
rep;
function quote(string)
{
escapable.lastIndex = 0;
return escapable.test(string) ? '"' + string.replace(escapable, function(a)
{
var c = meta[a];
return typeof c === 'string' ? c : '\\u' + ('0000' + (a.charCodeAt(0)).toString(16)).slice(-4);
}) + '"' : '"' + string + '"';
}
function str(key, holder)
{
var i,
k,
v,
length,
mind = gap,
partial,
value = holder[key];
if (value && typeof value === 'object' && typeof value.toJSON === 'function')
{
value = value.toJSON(key);
}
if (typeof rep === 'function')
{
value = rep.call(holder, key, value);
}
switch(typeof value) {
case 'string':
return quote(value);
case 'number':
return isFinite(value) ? String(value) : 'null';
case 'boolean':
case 'null':
return String(value);
case 'object':
if (!value)
{
return 'null';
}
gap += indent;
partial = [];
if (Object.prototype.toString.apply(value) === '[object Array]')
{
length = value.length;
for (i = 0; i < length; i += 1)
{
partial[i] = str(i, value) || 'null';
}
v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
gap = mind;
return v;
}
if (rep && typeof rep === 'object')
{
length = rep.length;
for (i = 0; i < length; i += 1)
{
k = rep[i];
if (typeof k === 'string')
{
v = str(k, value);
if (v)
{
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
}
else
{
for (k in value)
{
if (Object.hasOwnProperty.call(value, k))
{
v = str(k, value);
if (v)
{
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
}
v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
gap = mind;
return v;
}
}
if (typeof JSON.stringify !== 'function')
{
JSON.stringify = function(value, replacer, space)
{
var i;
gap = '';
indent = '';
if (typeof space === 'number')
{
for (i = 0; i < space; i += 1)
{
indent += ' ';
} } else if (typeof space === 'string')
{
indent = space;
} rep = replacer;
if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number'))
{
throw new Error('JSON.stringify');
} return str('', {'': value});
};
} if (typeof JSON.parse !== 'function')
{
JSON.parse = function(text, reviver)
{
var j;
function walk(holder, key)
{
var k,
v,
value = holder[key];
if (value && typeof value === 'object')
{
for (k in value)
{
if (Object.hasOwnProperty.call(value, k))
{
v = walk(value, k);
if (v !== undefined)
{
value[k] = v;
}
else
{
delete value[k];
}
}
}
}
return reviver.call(holder, key, value);
}
cx.lastIndex = 0;
if (cx.test(text))
{
text = text.replace(cx, function(a)
{
return '\\u' + ('0000' + (a.charCodeAt(0)).toString(16)).slice(-4);
});
} if (/^[\],:{}\s]*$/.test(((text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')).replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')).replace(/(?:^|:|,)(?:\s*\[)+/g, '')))
{
j = eval('(' + text + ')');
return typeof reviver === 'function' ? walk({'': j}, '') : j;
} throw new SyntaxError('JSON.parse');
};
} })();
var formatRegex = /([^%]+|%(?:\d+\$)?[\+\-\ \#0]*[0-9\*]*(.[0-9\*]+)?[hlL]?[cbBdieEfgGosuxXpn%@])/g,
tagRegex = /(%)(?:(\d+)\$)?([\+\-\ \#0]*)([0-9\*]*)((?:.[0-9\*]+)?)([hlL]?)([cbBdieEfgGosuxXpn%@])/;
exports.sprintf = function(format)
{
var format = arguments[0],
tokens = format.match(formatRegex),
index = 0,
result = "",
arg = 1;
for (var i = 0; i < tokens.length; i++)
{
var t = tokens[i];
if (format.substring(index, index + t.length) !== t)
return result;
index += t.length;
if (t.charAt(0) !== "%")
result += t;
else if (t === "%%")
result += "%";
else
{
var subtokens = t.match(tagRegex);
if (subtokens.length !== 8 || subtokens[0] !== t)
return result;
var percentSign = subtokens[1],
argIndex = subtokens[2],
flags = subtokens[3],
widthString = subtokens[4],
precisionString = subtokens[5],
length = subtokens[6],
specifier = subtokens[7];
if (argIndex === undefined || argIndex === null || argIndex === "")
argIndex = arg++;
else
argIndex = Number(argIndex);
var width = null;
if (widthString == "*")
width = arguments[argIndex];
else if (widthString !== "")
width = Number(widthString);
var precision = null;
if (precisionString === ".*")
precision = arguments[argIndex];
else if (precisionString !== "")
precision = Number(precisionString.substring(1));
var leftJustify = flags.indexOf("-") >= 0,
padZeros = flags.indexOf("0") >= 0,
subresult = "";
if (/[bBdiufeExXo]/.test(specifier))
{
var num = Number(arguments[argIndex]),
sign = "";
if (num < 0)
{
sign = "-";
} else
{
if (flags.indexOf("+") >= 0)
sign = "+";
else if (flags.indexOf(" ") >= 0)
sign = " ";
} if (specifier === "d" || specifier === "i" || specifier === "u")
{
var number = String(Math.abs(Math.floor(num)));
subresult = justify(sign, "", number, "", width, leftJustify, padZeros);
} if (specifier == "f")
{
var number = String(precision !== null ? (Math.abs(num)).toFixed(precision) : Math.abs(num)),
suffix = flags.indexOf("#") >= 0 && number.indexOf(".") < 0 ? "." : "";
subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros);
} if (specifier === "e" || specifier === "E")
{
var number = String((Math.abs(num)).toExponential(precision !== null ? precision : 21)),
suffix = flags.indexOf("#") >= 0 && number.indexOf(".") < 0 ? "." : "";
subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros);
} if (specifier == "x" || specifier == "X")
{
var number = String((Math.abs(num)).toString(16));
var prefix = flags.indexOf("#") >= 0 && num != 0 ? "0x" : "";
subresult = justify(sign, prefix, number, "", width, leftJustify, padZeros);
} if (specifier == "b" || specifier == "B")
{
var number = String((Math.abs(num)).toString(2));
var prefix = flags.indexOf("#") >= 0 && num != 0 ? "0b" : "";
subresult = justify(sign, prefix, number, "", width, leftJustify, padZeros);
} if (specifier == "o")
{
var number = String((Math.abs(num)).toString(8));
var prefix = flags.indexOf("#") >= 0 && num != 0 ? "0" : "";
subresult = justify(sign, prefix, number, "", width, leftJustify, padZeros);
} if (/[A-Z]/.test(specifier))
subresult = subresult.toUpperCase();
else
subresult = subresult.toLowerCase();
} else
{
var subresult = "";
if (specifier === "%")
subresult = "%";
else if (specifier === "c")
subresult = (String(arguments[argIndex])).charAt(0);
else if (specifier === "s" || specifier === "@")
subresult = String(arguments[argIndex]);
else if (specifier === "p" || specifier === "n")
subresult = "";
subresult = justify("", "", subresult, "", width, leftJustify, false);
} result += subresult;
} } return result;
};
function justify(sign, prefix, string, suffix, width, leftJustify, padZeros)
{
var length = sign.length + prefix.length + string.length + suffix.length;
if (leftJustify)
{
return sign + prefix + string + suffix + pad(width - length, " ");
}
else
{
if (padZeros)
return sign + prefix + pad(width - length, "0") + string + suffix;
else
return pad(width - length, " ") + sign + prefix + string + suffix;
}
}
function pad(n, ch)
{
return (Array(MAX(0, n) + 1)).join(ch);
}
CPLogDisable = false;
var CPLogDefaultTitle = "Cappuccino";
var CPLogLevels = ["fatal", "error", "warn", "info", "debug", "trace"];
var CPLogDefaultLevel = CPLogLevels[3];
var _CPLogLevelsInverted = {};
for (var i = 0; i < CPLogLevels.length; i++)
_CPLogLevelsInverted[CPLogLevels[i]] = i;
var _CPLogRegistrations = {};
CPLogRegister = function(aProvider, aMaxLevel, aFormatter)
{
CPLogRegisterRange(aProvider, CPLogLevels[0], aMaxLevel || CPLogLevels[CPLogLevels.length - 1], aFormatter);
};
CPLogRegisterRange = function(aProvider, aMinLevel, aMaxLevel, aFormatter)
{
var min = _CPLogLevelsInverted[aMinLevel];
var max = _CPLogLevelsInverted[aMaxLevel];
if (min !== undefined && max !== undefined && min <= max)
for (var i = min; i <= max; i++)
CPLogRegisterSingle(aProvider, CPLogLevels[i], aFormatter);
};
CPLogRegisterSingle = function(aProvider, aLevel, aFormatter)
{
if (!_CPLogRegistrations[aLevel])
_CPLogRegistrations[aLevel] = [];
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
if (_CPLogRegistrations[aLevel][i][0] === aProvider)
{
_CPLogRegistrations[aLevel][i][1] = aFormatter;
return;
} _CPLogRegistrations[aLevel].push([aProvider, aFormatter]);
};
CPLogUnregister = function(aProvider)
{
for (var aLevel in _CPLogRegistrations)
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
if (_CPLogRegistrations[aLevel][i][0] === aProvider)
_CPLogRegistrations[aLevel].splice(i--, 1);
};
function _CPLogDispatch(parameters, aLevel, aTitle)
{
if (aTitle == undefined)
aTitle = CPLogDefaultTitle;
if (aLevel == undefined)
aLevel = CPLogDefaultLevel;
var message = typeof parameters[0] == "string" && parameters.length > 1 ? exports.sprintf.apply(null, parameters) : String(parameters[0]);
if (_CPLogRegistrations[aLevel])
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
{
var logger = _CPLogRegistrations[aLevel][i];
logger[0](message, aLevel, aTitle, logger[1]);
}
}
CPLog = function()
{
_CPLogDispatch(arguments);
};
for (var i = 0; i < CPLogLevels.length; i++)
CPLog[CPLogLevels[i]] = ( function(level)
{
return function()
{
_CPLogDispatch(arguments, level);
};
})(CPLogLevels[i]);
var _CPFormatLogMessage = function(aString, aLevel, aTitle)
{
var now = new Date(),
titleAndLevel;
if (aLevel === null)
aLevel = "";
else
{
aLevel = aLevel || "info";
aLevel = "[" + CPLogColorize(aLevel, aLevel) + "]";
} aTitle = aTitle || "";
if (aTitle && aLevel)
aTitle += " ";
titleAndLevel = aTitle + aLevel;
if (titleAndLevel)
titleAndLevel += ": ";
if (typeof exports.sprintf == "function")
return exports.sprintf("%4d-%02d-%02d %02d:%02d:%02d.%03d %s%s", now.getFullYear(), now.getMonth() + 1, now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds(), titleAndLevel, aString);
else
return now + " " + titleAndLevel + ": " + aString;
};
CPLogConsole = function(aString, aLevel, aTitle, aFormatter)
{
if (typeof console != "undefined")
{
var message = (aFormatter || _CPFormatLogMessage)(aString, aLevel, aTitle),
logger = {"fatal": "error", "error": "error", "warn": "warn", "info": "info", "debug": "debug", "trace": "debug"}[aLevel];
if (logger && console[logger])
console[logger](message);
else if (console.log)
console.log(message);
} };
var levelColorMap = {"fatal": "red", "error": "red", "warn": "yellow", "info": "green", "debug": "cyan", "trace": "blue"};
try {
var SYSTEM = require("system");
var FILE = require("file");
if (SYSTEM.args[0])
CPLogDefaultTitle = FILE.basename(SYSTEM.args[0]);
}
catch(e) {
}
var stream;
CPLogColorize = function(aString, aLevel)
{
if (/^.*\x00\w+\([^\x00]*$/.test(aString))
return aString;
else
return "\0" + (levelColorMap[aLevel] || "info") + "(" + aString + "\0)";
};
CPLogPrint = function(aString, aLevel, aTitle, aFormatter)
{
if (stream === undefined)
{
try {
stream = (require("./term")).stream;
}
catch(e) {
stream = null;
}
} var formatter = aFormatter || _CPFormatLogMessage;
if (stream)
{
if (aLevel == "fatal" || aLevel == "error" || aLevel == "warn")
stream.print(CPLogColorize(formatter(aString, aLevel, aTitle), aLevel));
else
stream.print(formatter(aString, aLevel, aTitle));
} else if (typeof print != "undefined")
{
print(formatter(aString, aLevel, aTitle));
} };
CPLogDefault = CPLogPrint;
var undefined;
if (typeof window !== "undefined")
{
window.setNativeTimeout = window.setTimeout;
window.clearNativeTimeout = window.clearTimeout;
window.setNativeInterval = window.setInterval;
window.clearNativeInterval = window.clearInterval;
} NO = false;
YES = true;
nil = null;
Nil = null;
NULL = null;
ABS = Math.abs;
ASIN = Math.asin;
ACOS = Math.acos;
ATAN = Math.atan;
ATAN2 = Math.atan2;
SIN = Math.sin;
COS = Math.cos;
TAN = Math.tan;
EXP = Math.exp;
POW = Math.pow;
CEIL = Math.ceil;
FLOOR = Math.floor;
ROUND = Math.round;
MIN = Math.min;
MAX = Math.max;
RAND = Math.random;
SQRT = Math.sqrt;
E = Math.E;
LN2 = Math.LN2;
LN10 = Math.LN10;
LOG = Math.log;
LOG2E = Math.LOG2E;
LOG10E = Math.LOG10E;
PI = Math.PI;
PI2 = Math.PI * 2.0;
PI_2 = Math.PI / 2.0;
SQRT1_2 = Math.SQRT1_2;
SQRT2 = Math.SQRT2;
function EventDispatcher(anOwner)
{
this._eventListenersForEventNames = {};
this._owner = anOwner;
}
EventDispatcher.prototype.addEventListener = function(anEventName, anEventListener)
{
var eventListenersForEventNames = this._eventListenersForEventNames;
if (!hasOwnProperty.call(eventListenersForEventNames, anEventName))
{
var eventListenersForEventName = [];
eventListenersForEventNames[anEventName] = eventListenersForEventName;
} else
var eventListenersForEventName = eventListenersForEventNames[anEventName];
var index = eventListenersForEventName.length;
while (index--)
if (eventListenersForEventName[index] === anEventListener)
return;
eventListenersForEventName.push(anEventListener);
};
EventDispatcher.prototype.removeEventListener = function(anEventName, anEventListener)
{
var eventListenersForEventNames = this._eventListenersForEventNames;
if (!hasOwnProperty.call(eventListenersForEventNames, anEventName))
return;
var eventListenersForEventName = eventListenersForEventNames[anEventName],
index = eventListenersForEventName.length;
while (index--)
if (eventListenersForEventName[index] === anEventListener)
return eventListenersForEventName.splice(index, 1);
};
EventDispatcher.prototype.dispatchEvent = function(anEvent)
{
var type = anEvent.type,
eventListenersForEventNames = this._eventListenersForEventNames;
if (hasOwnProperty.call(eventListenersForEventNames, type))
{
var eventListenersForEventName = this._eventListenersForEventNames[type],
index = 0,
count = eventListenersForEventName.length;
for (; index < count; ++index)
eventListenersForEventName[index](anEvent);
} var manual = (this._owner || this)["on" + type];
if (manual)
manual(anEvent);
};
var asynchronousTimeoutCount = 0,
asynchronousTimeoutId = null,
asynchronousFunctionQueue = [];
function Asynchronous(aFunction)
{
var currentAsynchronousTimeoutCount = asynchronousTimeoutCount;
if (asynchronousTimeoutId === null)
{
window.setNativeTimeout( function()
{
var queue = asynchronousFunctionQueue,
index = 0,
count = asynchronousFunctionQueue.length;
++asynchronousTimeoutCount;
asynchronousTimeoutId = null;
asynchronousFunctionQueue = [];
for (; index < count; ++index)
queue[index]();
}, 0);
}
return function()
{
var args = arguments;
if (asynchronousTimeoutCount > currentAsynchronousTimeoutCount)
aFunction.apply(this, args);
else
asynchronousFunctionQueue.push( function()
{
aFunction.apply(this, args);
});
};
}
var NativeRequest = null;
if (window.XMLHttpRequest)
{
NativeRequest = window.XMLHttpRequest;
} else if (window.ActiveXObject !== undefined)
{
var MSXML_XMLHTTP_OBJECTS = ["Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0"],
index = MSXML_XMLHTTP_OBJECTS.length;
while (index--)
{
try {
var MSXML_XMLHTTP = MSXML_XMLHTTP_OBJECTS[index];
new ActiveXObject(MSXML_XMLHTTP);
NativeRequest = function()
{
return new ActiveXObject(MSXML_XMLHTTP);
};
break;
}
catch(anException) {
}
} } CFHTTPRequest = function()
{
this._isOpen = false;
this._requestHeaders = {};
this._mimeType = null;
this._eventDispatcher = new EventDispatcher(this);
this._nativeRequest = new NativeRequest();
this._withCredentials = false;
this._timeout = 60000;
var self = this;
this._stateChangeHandler = function()
{
determineAndDispatchHTTPRequestEvents(self);
};
this._timeoutHandler = function()
{
dispatchTimeoutHTTPRequestEvents(self);
};
this._nativeRequest.onreadystatechange = this._stateChangeHandler;
this._nativeRequest.ontimeout = this._timeoutHandler;
if (CFHTTPRequest.AuthenticationDelegate !== nil)
this._eventDispatcher.addEventListener("HTTP403", function()
{
CFHTTPRequest.AuthenticationDelegate(self);
});
};
CFHTTPRequest.UninitializedState = 0;
CFHTTPRequest.LoadingState = 1;
CFHTTPRequest.LoadedState = 2;
CFHTTPRequest.InteractiveState = 3;
CFHTTPRequest.CompleteState = 4;
CFHTTPRequest.AuthenticationDelegate = nil;
CFHTTPRequest.prototype.status = function()
{
try {
return this._nativeRequest.status || 0;
}
catch(anException) {
return 0;
}
};
CFHTTPRequest.prototype.statusText = function()
{
try {
return this._nativeRequest.statusText || "";
}
catch(anException) {
return "";
}
};
CFHTTPRequest.prototype.readyState = function()
{
return this._nativeRequest.readyState;
};
CFHTTPRequest.prototype.success = function()
{
var status = this.status();
if (status >= 200 && status < 300)
return YES;
return status === 0 && this.responseText() && (this.responseText()).length;
};
CFHTTPRequest.prototype.responseXML = function()
{
var responseXML = this._nativeRequest.responseXML;
if (responseXML && NativeRequest === window.XMLHttpRequest && responseXML.documentRoot)
return responseXML;
return parseXML(this.responseText());
};
CFHTTPRequest.prototype.responsePropertyList = function()
{
var responseText = this.responseText();
if (CFPropertyList.sniffedFormatOfString(responseText) === CFPropertyList.FormatXML_v1_0)
return CFPropertyList.propertyListFromXML(this.responseXML());
return CFPropertyList.propertyListFromString(responseText);
};
CFHTTPRequest.prototype.responseText = function()
{
return this._nativeRequest.responseText;
};
CFHTTPRequest.prototype.setRequestHeader = function(aHeader, aValue)
{
this._requestHeaders[aHeader] = aValue;
};
CFHTTPRequest.prototype.getResponseHeader = function(aHeader)
{
return this._nativeRequest.getResponseHeader(aHeader);
};
CFHTTPRequest.prototype.setTimeout = function(aTimeout)
{
this._timeout = aTimeout;
if (this._isOpen)
this._nativeRequest.timeout = aTimeout;
};
CFHTTPRequest.prototype.getTimeout = function(aTimeout)
{
return this._timeout;
};
CFHTTPRequest.prototype.getAllResponseHeaders = function()
{
return this._nativeRequest.getAllResponseHeaders();
};
CFHTTPRequest.prototype.overrideMimeType = function(aMimeType)
{
this._mimeType = aMimeType;
};
CFHTTPRequest.prototype.open = function(aMethod, aURL, isAsynchronous, aUser, aPassword)
{
var retval;
this._isOpen = true;
this._URL = aURL;
this._async = isAsynchronous;
this._method = aMethod;
this._user = aUser;
this._password = aPassword;
requestReturnValue = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword);
if (this._async)
{
this._nativeRequest.withCredentials = this._withCredentials;
this._nativeRequest.timeout = this._timeout;
} return requestReturnValue;
};
CFHTTPRequest.prototype.send = function(aBody)
{
if (!this._isOpen)
{
delete this._nativeRequest.onreadystatechange;
delete this._nativeRequest.ontimeout;
this._nativeRequest.open(this._method, this._URL, this._async, this._user, this._password);
this._nativeRequest.ontimeout = this._timeoutHandler;
this._nativeRequest.onreadystatechange = this._stateChangeHandler;
} for (var i in this._requestHeaders)
{
if (this._requestHeaders.hasOwnProperty(i))
this._nativeRequest.setRequestHeader(i, this._requestHeaders[i]);
} if (this._mimeType && "overrideMimeType" in this._nativeRequest)
this._nativeRequest.overrideMimeType(this._mimeType);
this._isOpen = false;
try {
return this._nativeRequest.send(aBody);
}
catch(anException) {
this._eventDispatcher.dispatchEvent({type: "failure", request: this});
}
};
CFHTTPRequest.prototype.abort = function()
{
this._isOpen = false;
return this._nativeRequest.abort();
};
CFHTTPRequest.prototype.addEventListener = function(anEventName, anEventListener)
{
this._eventDispatcher.addEventListener(anEventName, anEventListener);
};
CFHTTPRequest.prototype.removeEventListener = function(anEventName, anEventListener)
{
this._eventDispatcher.removeEventListener(anEventName, anEventListener);
};
CFHTTPRequest.prototype.setWithCredentials = function(willSendWithCredentials)
{
this._withCredentials = willSendWithCredentials;
if (this._isOpen && this._async)
this._nativeRequest.withCredentials = willSendWithCredentials;
};
CFHTTPRequest.prototype.withCredentials = function()
{
return this._withCredentials;
};
CFHTTPRequest.prototype.isTimeoutRequest = function()
{
return !this.success() && !this._nativeRequest.response && !this._nativeRequest.responseText && !this._nativeRequest.responseType && !this._nativeRequest.responseURL && !this._nativeRequest.responseXML;
};
function dispatchTimeoutHTTPRequestEvents(aRequest)
{
aRequest._eventDispatcher.dispatchEvent({type: "timeout", request: aRequest});
}
function determineAndDispatchHTTPRequestEvents(aRequest)
{
var eventDispatcher = aRequest._eventDispatcher,
readyStates = ["uninitialized", "loading", "loaded", "interactive", "complete"];
eventDispatcher.dispatchEvent({type: "readystatechange", request: aRequest});
if (readyStates[aRequest.readyState()] === "complete")
{
var status = "HTTP" + aRequest.status();
eventDispatcher.dispatchEvent({type: status, request: aRequest});
var result = aRequest.success() ? "success" : "failure";
eventDispatcher.dispatchEvent({type: result, request: aRequest});
eventDispatcher.dispatchEvent({type: readyStates[aRequest.readyState()], request: aRequest});
}
else
{
eventDispatcher.dispatchEvent({type: readyStates[aRequest.readyState()], request: aRequest});
}
}
function FileRequest(aURL, onsuccess, onfailure, onprogress)
{
var request = new CFHTTPRequest();
if (aURL.pathExtension() === "plist")
request.overrideMimeType("text/xml");
var loaded = 0,
progressHandler = null;
function progress(progressEvent)
{
onprogress(progressEvent.loaded - loaded);
loaded = progressEvent.loaded;
}
function success(anEvent)
{
if (onprogress && progressHandler === null)
onprogress((anEvent.request.responseText()).length);
onsuccess(anEvent);
}
if (exports.asyncLoader)
{
request.onsuccess = Asynchronous(success);
request.onfailure = Asynchronous(onfailure);
}
else
{
request.onsuccess = success;
request.onfailure = onfailure;
}
request.open("GET", aURL.absoluteString(), exports.asyncLoader);
request.send("");
}
exports.asyncLoader = NO;
exports.Asynchronous = Asynchronous;
exports.determineAndDispatchHTTPRequestEvents = determineAndDispatchHTTPRequestEvents;
var OBJECT_COUNT = 0;
objj_generateObjectUID = function()
{
return OBJECT_COUNT++;
};
CFPropertyList = function()
{
this._UID = objj_generateObjectUID();
};
CFPropertyList.DTDRE = /^\s*(?:<\?\s*xml\s+version\s*=\s*\"1.0\"[^>]*\?>\s*)?(?:<\!DOCTYPE[^>]*>\s*)?/i;
CFPropertyList.XMLRE = /^\s*(?:<\?\s*xml\s+version\s*=\s*\"1.0\"[^>]*\?>\s*)?(?:<\!DOCTYPE[^>]*>\s*)?<\s*plist[^>]*\>/i;
CFPropertyList.FormatXMLDTD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">";
CFPropertyList.Format280NorthMagicNumber = "280NPLIST";
(CFPropertyList.FormatOpenStep = 1, CFPropertyList.FormatXML_v1_0 = 100, CFPropertyList.FormatBinary_v1_0 = 200, CFPropertyList.Format280North_v1_0 = -1000);
CFPropertyList.sniffedFormatOfString = function(aString)
{
if (aString.match(CFPropertyList.XMLRE))
return CFPropertyList.FormatXML_v1_0;
if (aString.substr(0, CFPropertyList.Format280NorthMagicNumber.length) === CFPropertyList.Format280NorthMagicNumber)
return CFPropertyList.Format280North_v1_0;
return NULL;
};
CFPropertyList.dataFromPropertyList = function(aPropertyList, aFormat)
{
var data = new CFMutableData();
data.setRawString(CFPropertyList.stringFromPropertyList(aPropertyList, aFormat));
return data;
};
CFPropertyList.stringFromPropertyList = function(aPropertyList, aFormat)
{
if (!aFormat)
aFormat = CFPropertyList.Format280North_v1_0;
var serializers = CFPropertyListSerializers[aFormat];
return serializers["start"]() + serializePropertyList(aPropertyList, serializers) + serializers["finish"]();
};
CFPropertyList.readPropertyListFromFile = function(aFilePath)
{
return CFPropertyList.propertyListFromString(FILE.read(aFilePath, {charset: "UTF-8"}));
};
CFPropertyList.writePropertyListToFile = function(aPropertyList, aFilePath, aFormat)
{
return FILE.write(aFilePath, CFPropertyList.stringFromPropertyList(aPropertyList, aFormat), {charset: "UTF-8"});
};
CFPropertyList.modifyPlist = function(aFilePath, aCallback, aFormat)
{
var string = FILE.read(aFilePath, {charset: "UTF-8"});
var format = CFPropertyList.sniffedFormatOfString(string);
var plist = CFPropertyList.propertyListFromString(string, format);
aCallback(plist);
CFPropertyList.writePropertyListToFile(plist, aFilePath, aFormat || format);
};
function serializePropertyList(aPropertyList, serializers)
{
var type = typeof aPropertyList,
valueOf = aPropertyList.valueOf(),
typeValueOf = typeof valueOf;
if (type !== typeValueOf)
{
type = typeValueOf;
aPropertyList = valueOf;
}
if (aPropertyList === YES || aPropertyList === NO)
type = "boolean";
else if (type === "number")
{
if (FLOOR(aPropertyList) === aPropertyList && ("" + aPropertyList).indexOf('e') == -1)
type = "integer";
else
type = "real";
}
else if (type !== "string")
{
if (aPropertyList.slice)
type = "array";
else
type = "dictionary";
}
return serializers[type](aPropertyList, serializers);
}
var CFPropertyListSerializers = {};
CFPropertyListSerializers[CFPropertyList.FormatXML_v1_0] = {"start": function()
{
return CFPropertyList.FormatXMLDTD + "<plist version = \"1.0\">";
}, "finish": function()
{
return "</plist>";
}, "string": function(aString)
{
return "<string>" + encodeHTMLComponent(aString) + "</string>";
}, "boolean": function(aBoolean)
{
return aBoolean ? "<true/>" : "<false/>";
}, "integer": function(anInteger)
{
return "<integer>" + anInteger + "</integer>";
}, "real": function(aFloat)
{
return "<real>" + aFloat + "</real>";
}, "array": function(anArray, serializers)
{
var index = 0,
count = anArray.length,
string = "<array>";
for (; index < count; ++index)
string += serializePropertyList(anArray[index], serializers);
return string + "</array>";
}, "dictionary": function(aDictionary, serializers)
{
var keys = aDictionary._keys,
index = 0,
count = keys.length,
string = "<dict>";
for (; index < count; ++index)
{
var key = keys[index];
string += "<key>" + key + "</key>";
string += serializePropertyList(aDictionary.valueForKey(key), serializers);
} return string + "</dict>";
}};
var ARRAY_MARKER = "A",
DICTIONARY_MARKER = "D",
FLOAT_MARKER = "f",
INTEGER_MARKER = "d",
STRING_MARKER = "S",
TRUE_MARKER = "T",
FALSE_MARKER = "F",
KEY_MARKER = "K",
END_MARKER = "E";
CFPropertyListSerializers[CFPropertyList.Format280North_v1_0] = {"start": function()
{
return CFPropertyList.Format280NorthMagicNumber + ";1.0;";
}, "finish": function()
{
return "";
}, "string": function(aString)
{
return STRING_MARKER + ';' + aString.length + ';' + aString;
}, "boolean": function(aBoolean)
{
return (aBoolean ? TRUE_MARKER : FALSE_MARKER) + ';';
}, "integer": function(anInteger)
{
var string = "" + anInteger;
return INTEGER_MARKER + ';' + string.length + ';' + string;
}, "real": function(aFloat)
{
var string = "" + aFloat;
return FLOAT_MARKER + ';' + string.length + ';' + string;
}, "array": function(anArray, serializers)
{
var index = 0,
count = anArray.length,
string = ARRAY_MARKER + ';';
for (; index < count; ++index)
string += serializePropertyList(anArray[index], serializers);
return string + END_MARKER + ';';
}, "dictionary": function(aDictionary, serializers)
{
var keys = aDictionary._keys,
index = 0,
count = keys.length,
string = DICTIONARY_MARKER + ';';
for (; index < count; ++index)
{
var key = keys[index];
string += KEY_MARKER + ';' + key.length + ';' + key;
string += serializePropertyList(aDictionary.valueForKey(key), serializers);
} return string + END_MARKER + ';';
}};
var XML_XML = "xml",
XML_DOCUMENT = "#document",
PLIST_PLIST = "plist",
PLIST_KEY = "key",
PLIST_DICTIONARY = "dict",
PLIST_ARRAY = "array",
PLIST_STRING = "string",
PLIST_DATE = "date",
PLIST_BOOLEAN_TRUE = "true",
PLIST_BOOLEAN_FALSE = "false",
PLIST_NUMBER_REAL = "real",
PLIST_NUMBER_INTEGER = "integer",
PLIST_DATA = "data";
var textContent = function(nodes)
{
var text = "",
index = 0,
count = nodes.length;
for (; index < count; ++index)
{
var node = nodes[index];
if (node.nodeType === 3 || node.nodeType === 4)
text += node.nodeValue;
else if (node.nodeType !== 8)
text += textContent(node.childNodes);
} return text;
};
var _plist_traverseNextNode = function(anXMLNode, stayWithin, stack)
{
var node = anXMLNode;
{
node = node.firstChild;
if (node != NULL && (node.nodeType === 8 || node.nodeType === 3 || node.nodeType === 7))
while ((node = node.nextSibling) && (node.nodeType === 8 || node.nodeType === 3 || node.nodeType === 7));
} if (node)
return node;
if (String(anXMLNode.nodeName) === PLIST_ARRAY || String(anXMLNode.nodeName) === PLIST_DICTIONARY)
stack.pop();
else
{
if (node === stayWithin)
return NULL;
node = anXMLNode;
while ((node = node.nextSibling) && (node.nodeType === 8 || node.nodeType === 3 || node.nodeType === 7));
if (node)
return node;
} node = anXMLNode;
while (node)
{
var next = node;
while ((next = next.nextSibling) && (next.nodeType === 8 || next.nodeType === 3 || next.nodeType === 7));
if (next)
return next;
var node = node.parentNode;
if (stayWithin && node === stayWithin)
return NULL;
stack.pop();
} return NULL;
};
CFPropertyList.propertyListFromData = function(aData, aFormat)
{
return CFPropertyList.propertyListFromString(aData.rawString(), aFormat);
};
CFPropertyList.propertyListFromString = function(aString, aFormat)
{
if (!aFormat)
aFormat = CFPropertyList.sniffedFormatOfString(aString);
if (aFormat === CFPropertyList.FormatXML_v1_0)
return CFPropertyList.propertyListFromXML(aString);
if (aFormat === CFPropertyList.Format280North_v1_0)
return propertyListFrom280NorthString(aString);
return NULL;
};
var ARRAY_MARKER = "A",
DICTIONARY_MARKER = "D",
FLOAT_MARKER = "f",
INTEGER_MARKER = "d",
STRING_MARKER = "S",
TRUE_MARKER = "T",
FALSE_MARKER = "F",
KEY_MARKER = "K",
END_MARKER = "E";
function propertyListFrom280NorthString(aString)
{
var stream = new MarkedStream(aString),
marker = NULL,
key = "",
object = NULL,
plistObject = NULL,
containers = [],
currentContainer = NULL;
while (marker = stream.getMarker())
{
if (marker === END_MARKER)
{
containers.pop();
continue;
}
var count = containers.length;
if (count)
currentContainer = containers[count - 1];
if (marker === KEY_MARKER)
{
key = stream.getString();
marker = stream.getMarker();
}
switch(marker) {
case ARRAY_MARKER:
object = [];
containers.push(object);
break;
case DICTIONARY_MARKER:
object = new CFMutableDictionary();
containers.push(object);
break;
case FLOAT_MARKER:
object = parseFloat(stream.getString());
break;
case INTEGER_MARKER:
object = parseInt(stream.getString(), 10);
break;
case STRING_MARKER:
object = stream.getString();
break;
case TRUE_MARKER:
object = YES;
break;
case FALSE_MARKER:
object = NO;
break;
default:
throw new Error("*** " + marker + " marker not recognized in Plist.");
}
if (!plistObject)
plistObject = object;
else if (currentContainer)
if (currentContainer.slice)
currentContainer.push(object);
else
currentContainer.setValueForKey(key, object);
}
return plistObject;
}
function encodeHTMLComponent(aString)
{
return ((((aString.replace(/&/g, '&')).replace(/"/g, '"')).replace(/'/g, ''')).replace(/</g, '<')).replace(/>/g, '>');
}
function decodeHTMLComponent(aString)
{
return ((((aString.replace(/"/g, '"')).replace(/'/g, '\'')).replace(/</g, '<')).replace(/>/g, '>')).replace(/&/g,