UNPKG

objj-runtime

Version:

JavaScript (ECMAScript) and Objective-J runtime

1,238 lines 210 kB
(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, '&amp;')).replace(/"/g, '&quot;')).replace(/'/g, '&apos;')).replace(/</g, '&lt;')).replace(/>/g, '&gt;'); } function decodeHTMLComponent(aString) { return ((((aString.replace(/&quot;/g, '"')).replace(/&apos;/g, '\'')).replace(/&lt;/g, '<')).replace(/&gt;/g, '>')).replace(/&amp;/g,