var pas = {}; var rtl = { quiet: false, debug_load_units: false, debug_rtti: false, debug: function(){ if (rtl.quiet || !console || !console.log) return; console.log(arguments); }, error: function(s){ rtl.debug('Error: ',s); throw s; }, warn: function(s){ rtl.debug('Warn: ',s); }, hasString: function(s){ return rtl.isString(s) && (s.length>0); }, isArray: function(a) { return Array.isArray(a); }, isFunction: function(f){ return typeof(f)==="function"; }, isModule: function(m){ return rtl.isObject(m) && rtl.hasString(m.$name) && (pas[m.$name]===m); }, isImplementation: function(m){ return rtl.isObject(m) && rtl.isModule(m.$module) && (m.$module.$impl===m); }, isNumber: function(n){ return typeof(n)==="number"; }, isObject: function(o){ var s=typeof(o); return (typeof(o)==="object") && (o!=null); }, isString: function(s){ return typeof(s)==="string"; }, getNumber: function(n){ return typeof(n)==="number"?n:NaN; }, getChar: function(c){ return ((typeof(c)==="string") && (c.length===1)) ? c : ""; }, getObject: function(o){ return ((typeof(o)==="object") || (typeof(o)==='function')) ? o : null; }, isPasClass: function(type){ return (rtl.isObject(type) && type.hasOwnProperty('$classname') && rtl.isObject(type.$module)); }, isPasClassInstance: function(type){ return (rtl.isObject(type) && rtl.isPasClass(type.$class)); }, hexStr: function(n,digits){ return ("000000000000000"+n.toString(16).toUpperCase()).slice(-digits); }, m_loading: 0, m_loading_intf: 1, m_intf_loaded: 2, m_loading_impl: 3, // loading all used unit m_initializing: 4, // running initialization m_initialized: 5, module: function(module_name, intfuseslist, intfcode, impluseslist, implcode){ if (rtl.debug_load_units) rtl.debug('rtl.module name="'+module_name+'" intfuses='+intfuseslist+' impluses='+impluseslist+' hasimplcode='+rtl.isFunction(implcode)); if (!rtl.hasString(module_name)) rtl.error('invalid module name "'+module_name+'"'); if (!rtl.isArray(intfuseslist)) rtl.error('invalid interface useslist of "'+module_name+'"'); if (!rtl.isFunction(intfcode)) rtl.error('invalid interface code of "'+module_name+'"'); if (!(impluseslist==undefined) && !rtl.isArray(impluseslist)) rtl.error('invalid implementation useslist of "'+module_name+'"'); if (!(implcode==undefined) && !rtl.isFunction(implcode)) rtl.error('invalid implementation code of "'+module_name+'"'); if (pas[module_name]) rtl.error('module "'+module_name+'" is already registered'); var module = pas[module_name] = { $name: module_name, $intfuseslist: intfuseslist, $impluseslist: impluseslist, $state: rtl.m_loading, $intfcode: intfcode, $implcode: implcode, $impl: null, $rtti: Object.create(rtl.tSectionRTTI) }; module.$rtti.$module = module; if (implcode) module.$impl = { $module: module, $rtti: module.$rtti }; }, exitcode: 0, run: function(module_name){ function doRun(){ if (!rtl.hasString(module_name)) module_name='program'; if (rtl.debug_load_units) rtl.debug('rtl.run module="'+module_name+'"'); rtl.initRTTI(); var module = pas[module_name]; if (!module) rtl.error('rtl.run module "'+module_name+'" missing'); rtl.loadintf(module); rtl.loadimpl(module); if (module_name=='program'){ if (rtl.debug_load_units) rtl.debug('running $main'); var r = pas.program.$main(); if (rtl.isNumber(r)) rtl.exitcode = r; } } if (rtl.showUncaughtExceptions) { try{ doRun(); } catch(re) { var errMsg = re.hasOwnProperty('$class') ? re.$class.$classname : ''; errMsg += ((errMsg) ? ': ' : '') + (re.hasOwnProperty('fMessage') ? re.fMessage : re); alert('Uncaught Exception : '+errMsg); rtl.exitCode = 216; } } else { doRun(); } return rtl.exitcode; }, loadintf: function(module){ if (module.$state>rtl.m_loading_intf) return; // already finished if (rtl.debug_load_units) rtl.debug('loadintf: "'+module.$name+'"'); if (module.$state===rtl.m_loading_intf) rtl.error('unit cycle detected "'+module.$name+'"'); module.$state=rtl.m_loading_intf; // load interfaces of interface useslist rtl.loaduseslist(module,module.$intfuseslist,rtl.loadintf); // run interface if (rtl.debug_load_units) rtl.debug('loadintf: run intf of "'+module.$name+'"'); module.$intfcode(module.$intfuseslist); // success module.$state=rtl.m_intf_loaded; // Note: units only used in implementations are not yet loaded (not even their interfaces) }, loaduseslist: function(module,useslist,f){ if (useslist==undefined) return; for (var i in useslist){ var unitname=useslist[i]; if (rtl.debug_load_units) rtl.debug('loaduseslist of "'+module.$name+'" uses="'+unitname+'"'); if (pas[unitname]==undefined) rtl.error('module "'+module.$name+'" misses "'+unitname+'"'); f(pas[unitname]); } }, loadimpl: function(module){ if (module.$state>=rtl.m_loading_impl) return; // already processing if (module.$state0){ o = this[newinstancefnname](fnname,args); } else { o = Object.create(this); } o.$class = this; // Note: o.$class === Object.getPrototypeOf(o) o.$init(); try{ o[fnname].apply(o,args); if (o.AfterConstruction) o.AfterConstruction(); } catch($e){ o.$destroy; throw $e; } return o; }; c.$destroy = function(fnname){ if (this.BeforeDestruction) this.BeforeDestruction(); this[fnname](); this.$final; }; rtl.initClass(c,parent,name,initfn); }, tObjectDestroy: "Destroy", free: function(obj,name){ if (obj[name]==null) return; obj[name].$destroy(rtl.tObjectDestroy); obj[name]=null; }, freeLoc: function(obj){ if (obj==null) return; obj.$destroy(rtl.tObjectDestroy); return null; }, is: function(instance,type){ return type.isPrototypeOf(instance) || (instance===type); }, isExt: function(instance,type,mode){ // mode===1 means instance must be a Pascal class instance // mode===2 means instance must be a Pascal class // Notes: // isPrototypeOf and instanceof return false on equal // isPrototypeOf does not work for Date.isPrototypeOf(new Date()) // so if isPrototypeOf is false test with instanceof // instanceof needs a function on right side if (instance == null) return false; // Note: ==null checks for undefined too if ((typeof(type) !== 'object') && (typeof(type) !== 'function')) return false; if (instance === type){ if (mode===1) return false; if (mode===2) return rtl.isPasClass(instance); return true; } if (type.isPrototypeOf && type.isPrototypeOf(instance)){ if (mode===1) return rtl.isPasClassInstance(instance); if (mode===2) return rtl.isPasClass(instance); return true; } if ((typeof type == 'function') && (instance instanceof type)) return true; return false; }, Exception: null, EInvalidCast: null, EAbstractError: null, ERangeError: null, raiseE: function(typename){ var t = rtl[typename]; if (t==null){ var mod = pas.SysUtils; if (!mod) mod = pas.sysutils; if (mod){ t = mod[typename]; if (!t) t = mod[typename.toLowerCase()]; if (!t) t = mod['Exception']; if (!t) t = mod['exception']; } } if (t){ if (t.Create){ throw t.$create("Create"); } else if (t.create){ throw t.$create("create"); } } if (typename === "EInvalidCast") throw "invalid type cast"; if (typename === "EAbstractError") throw "Abstract method called"; if (typename === "ERangeError") throw "range error"; throw typename; }, as: function(instance,type){ if((instance === null) || rtl.is(instance,type)) return instance; rtl.raiseE("EInvalidCast"); }, asExt: function(instance,type,mode){ if((instance === null) || rtl.isExt(instance,type,mode)) return instance; rtl.raiseE("EInvalidCast"); }, createInterface: function(module, name, guid, fnnames, ancestor, initfn){ //console.log('createInterface name="'+name+'" guid="'+guid+'" names='+fnnames); var i = ancestor?Object.create(ancestor):{}; module[name] = i; i.$module = module; i.$name = name; i.$fullname = module.$name+'.'+name; i.$guid = guid; i.$guidr = null; i.$names = fnnames?fnnames:[]; if (rtl.isFunction(initfn)){ // rtti if (rtl.debug_rtti) rtl.debug('createInterface '+i.$fullname); var t = i.$module.$rtti.$Interface(name,{ "interface": i, module: module }); i.$rtti = t; if (ancestor) t.ancestor = ancestor.$rtti; if (!t.ancestor) t.ancestor = null; initfn.call(i); } return i; }, strToGUIDR: function(s,g){ var p = 0; function n(l){ var h = s.substr(p,l); p+=l; return parseInt(h,16); } p+=1; // skip { g.D1 = n(8); p+=1; // skip - g.D2 = n(4); p+=1; // skip - g.D3 = n(4); p+=1; // skip - if (!g.D4) g.D4=[]; g.D4[0] = n(2); g.D4[1] = n(2); p+=1; // skip - for(var i=2; i<8; i++) g.D4[i] = n(2); return g; }, guidrToStr: function(g){ if (g.$intf) return g.$intf.$guid; var h = rtl.hexStr; var s='{'+h(g.D1,8)+'-'+h(g.D2,4)+'-'+h(g.D3,4)+'-'+h(g.D4[0],2)+h(g.D4[1],2)+'-'; for (var i=2; i<8; i++) s+=h(g.D4[i],2); s+='}'; return s; }, createTGUID: function(guid){ var TGuid = (pas.System)?pas.System.TGuid:pas.system.tguid; var g = rtl.strToGUIDR(guid,new TGuid()); return g; }, getIntfGUIDR: function(intfTypeOrVar){ if (!intfTypeOrVar) return null; if (!intfTypeOrVar.$guidr){ var g = rtl.createTGUID(intfTypeOrVar.$guid); if (!intfTypeOrVar.hasOwnProperty('$guid')) intfTypeOrVar = Object.getPrototypeOf(intfTypeOrVar); g.$intf = intfTypeOrVar; intfTypeOrVar.$guidr = g; } return intfTypeOrVar.$guidr; }, addIntf: function (aclass, intf, map){ function jmp(fn){ if (typeof(fn)==="function"){ return function(){ return fn.apply(this.$o,arguments); }; } else { return function(){ rtl.raiseE('EAbstractError'); }; } } if(!map) map = {}; var t = intf; var item = Object.create(t); aclass.$intfmaps[intf.$guid] = item; do{ var names = t.$names; if (!names) break; for (var i=0; i=minval) && (i<=maxval)) return i; rtl.raiseE('ERangeError'); }, rcc: function(c,minval,maxval){ // range check char if ((typeof(c)==='string') && (c.length===1)){ var i = c.charCodeAt(0); if ((i>=minval) && (i<=maxval)) return c; } rtl.raiseE('ERangeError'); }, rcSetCharAt: function(s,index,c){ // range check setCharAt if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError'); return rtl.setCharAt(s,index,c); }, rcCharAt: function(s,index){ // range check charAt if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError'); return s.charAt(index); }, rcArrR: function(arr,index){ // range check read array if (Array.isArray(arr) && (typeof(index)==='number') && (index>=0) && (index2){ // arr,index1,index2,... arr=arr[index]; for (var i=2; i=0) && (indexsrcarray.length) end = srcarray.length; if (index>=end) return []; if (type===0){ return srcarray.slice(index,end); } else { var a = []; a.length = end-index; rtl.arrayClone(type,srcarray,index,end,a,0); return a; } }, setCharAt: function(s,index,c){ return s.substr(0,index)+c+s.substr(index+1); }, getResStr: function(mod,name){ var rs = mod.$resourcestrings[name]; return rs.current?rs.current:rs.org; }, createSet: function(){ var s = {}; for (var i=0; i newlen){ return s.substring(0,newlen); } else if (s.repeat){ // Note: repeat needs ECMAScript6! return s+' '.repeat(newlen-oldlen); } else { while (oldlen=width) return s; if (s.repeat){ // Note: repeat needs ECMAScript6! return ' '.repeat(width-l) + s; } else { while (l2){ return rtl.spaceLeft(d.toFixed(p),w); } else { // exponent width var pad = ""; var ad = Math.abs(d); if (ad<1.0e+10) { pad='00'; } else if (ad<1.0e+100) { pad='0'; } if (arguments.length<2) { w=9; } else if (w<9) { w=9; } var p = w-8; var s=(d>0 ? " " : "" ) + d.toExponential(p); s=s.replace(/e(.)/,'E$1'+pad); return rtl.spaceLeft(s,w); } }, initRTTI: function(){ if (rtl.debug_rtti) rtl.debug('initRTTI'); // base types rtl.tTypeInfo = { name: "tTypeInfo" }; function newBaseTI(name,kind,ancestor){ if (!ancestor) ancestor = rtl.tTypeInfo; if (rtl.debug_rtti) rtl.debug('initRTTI.newBaseTI "'+name+'" '+kind+' ("'+ancestor.name+'")'); var t = Object.create(ancestor); t.name = name; t.kind = kind; rtl[name] = t; return t; }; function newBaseInt(name,minvalue,maxvalue,ordtype){ var t = newBaseTI(name,1 /* tkInteger */,rtl.tTypeInfoInteger); t.minvalue = minvalue; t.maxvalue = maxvalue; t.ordtype = ordtype; return t; }; newBaseTI("tTypeInfoInteger",1 /* tkInteger */); newBaseInt("shortint",-0x80,0x7f,0); newBaseInt("byte",0,0xff,1); newBaseInt("smallint",-0x8000,0x7fff,2); newBaseInt("word",0,0xffff,3); newBaseInt("longint",-0x80000000,0x7fffffff,4); newBaseInt("longword",0,0xffffffff,5); newBaseInt("nativeint",-0x10000000000000,0xfffffffffffff,6); newBaseInt("nativeuint",0,0xfffffffffffff,7); newBaseTI("char",2 /* tkChar */); newBaseTI("string",3 /* tkString */); newBaseTI("tTypeInfoEnum",4 /* tkEnumeration */,rtl.tTypeInfoInteger); newBaseTI("tTypeInfoSet",5 /* tkSet */); newBaseTI("double",6 /* tkDouble */); newBaseTI("boolean",7 /* tkBool */); newBaseTI("tTypeInfoProcVar",8 /* tkProcVar */); newBaseTI("tTypeInfoMethodVar",9 /* tkMethod */,rtl.tTypeInfoProcVar); newBaseTI("tTypeInfoArray",10 /* tkArray */); newBaseTI("tTypeInfoDynArray",11 /* tkDynArray */); newBaseTI("tTypeInfoPointer",15 /* tkPointer */); var t = newBaseTI("pointer",15 /* tkPointer */,rtl.tTypeInfoPointer); t.reftype = null; newBaseTI("jsvalue",16 /* tkJSValue */); newBaseTI("tTypeInfoRefToProcVar",17 /* tkRefToProcVar */,rtl.tTypeInfoProcVar); // member kinds rtl.tTypeMember = {}; function newMember(name,kind){ var m = Object.create(rtl.tTypeMember); m.name = name; m.kind = kind; rtl[name] = m; }; newMember("tTypeMemberField",1); // tmkField newMember("tTypeMemberMethod",2); // tmkMethod newMember("tTypeMemberProperty",3); // tmkProperty // base object for storing members: a simple object rtl.tTypeMembers = {}; // tTypeInfoStruct - base object for tTypeInfoClass, tTypeInfoRecord, tTypeInfoInterface var tis = newBaseTI("tTypeInfoStruct",0); tis.$addMember = function(name,ancestor,options){ if (rtl.debug_rtti){ if (!rtl.hasString(name) || (name.charAt()==='$')) throw 'invalid member "'+name+'", this="'+this.name+'"'; if (!rtl.is(ancestor,rtl.tTypeMember)) throw 'invalid ancestor "'+ancestor+':'+ancestor.name+'", "'+this.name+'.'+name+'"'; if ((options!=undefined) && (typeof(options)!='object')) throw 'invalid options "'+options+'", "'+this.name+'.'+name+'"'; }; var t = Object.create(ancestor); t.name = name; this.members[name] = t; this.names.push(name); if (rtl.isObject(options)){ for (var key in options) if (options.hasOwnProperty(key)) t[key] = options[key]; }; return t; }; tis.addField = function(name,type,options){ var t = this.$addMember(name,rtl.tTypeMemberField,options); if (rtl.debug_rtti){ if (!rtl.is(type,rtl.tTypeInfo)) throw 'invalid type "'+type+'", "'+this.name+'.'+name+'"'; }; t.typeinfo = type; this.fields.push(name); return t; }; tis.addFields = function(){ var i=0; while(i0) ? S.substring(Index-1,Index+Size-1) : ""; }; this.Copy$1 = function (S, Index) { if (Index<1) Index = 1; return S.substr(Index-1); }; this.Delete = function (S, Index, Size) { var h = ""; if (((Index < 1) || (Index > S.get().length)) || (Size <= 0)) return; h = S.get(); S.set($mod.Copy(h,1,Index - 1) + $mod.Copy$1(h,Index + Size)); }; this.Pos = function (Search, InString) { return InString.indexOf(Search)+1; }; this.Pos$1 = function (Search, InString, StartAt) { return InString.indexOf(Search,StartAt-1)+1; }; this.Insert = function (Insertion, Target, Index) { var t = ""; if (Insertion === "") return; t = Target.get(); if (Index < 1) { Target.set(Insertion + t)} else if (Index > t.length) { Target.set(t + Insertion)} else Target.set(($mod.Copy(t,1,Index - 1) + Insertion) + $mod.Copy(t,Index,t.length)); }; this.upcase = function (c) { return c.toUpperCase(); }; this.val = function (S, NI, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x) || (x !== $mod.Int(x))) { Code.set(1)} else NI.set($mod.Trunc(x)); }; this.val$1 = function (S, SI, Code) { var X = 0.0; Code.set(0); X = Number(S); if (isNaN(X) || (X !== $mod.Int(X))) { Code.set(1)} else if ((X < -128) || (X > 127)) { Code.set(2)} else SI.set($mod.Trunc(X)); }; this.val$2 = function (S, B, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x) || (x !== $mod.Int(x))) { Code.set(1)} else if ((x < 0) || (x > 255)) { Code.set(2)} else B.set($mod.Trunc(x)); }; this.val$3 = function (S, SI, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x) || (x !== $mod.Int(x))) { Code.set(1)} else if ((x < -32768) || (x > 32767)) { Code.set(2)} else SI.set($mod.Trunc(x)); }; this.val$4 = function (S, W, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x)) { Code.set(1)} else if ((x < 0) || (x > 65535)) { Code.set(2)} else W.set($mod.Trunc(x)); }; this.val$5 = function (S, I, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x)) { Code.set(1)} else if (x > 2147483647) { Code.set(2)} else I.set($mod.Trunc(x)); }; this.val$6 = function (S, C, Code) { var x = 0.0; Code.set(0); x = Number(S); if (isNaN(x) || (x !== $mod.Int(x))) { Code.set(1)} else if ((x < 0) || (x > 4294967295)) { Code.set(2)} else C.set($mod.Trunc(x)); }; this.val$7 = function (S, d, Code) { var x = 0.0; x = Number(S); if (isNaN(x)) { Code.set(1)} else { Code.set(0); d.set(x); }; }; this.StringOfChar = function (c, l) { var Result = ""; var i = 0; Result = ""; for (var $l1 = 1, $end2 = l; $l1 <= $end2; $l1++) { i = $l1; Result = Result + c; }; return Result; }; this.Write = function () { var i = 0; for (var $l1 = 0, $end2 = rtl.length(arguments) - 1; $l1 <= $end2; $l1++) { i = $l1; if ($impl.WriteCallBack != null) { $impl.WriteCallBack(arguments[i],false)} else $impl.WriteBuf = $impl.WriteBuf + ("" + arguments[i]); }; }; this.Writeln = function () { var i = 0; var l = 0; var s = ""; l = rtl.length(arguments) - 1; if ($impl.WriteCallBack != null) { for (var $l1 = 0, $end2 = l; $l1 <= $end2; $l1++) { i = $l1; $impl.WriteCallBack(arguments[i],i === l); }; } else { s = $impl.WriteBuf; for (var $l3 = 0, $end4 = l; $l3 <= $end4; $l3++) { i = $l3; s = s + ("" + arguments[i]); }; console.log(s); $impl.WriteBuf = ""; }; }; this.SetWriteCallBack = function (H) { var Result = null; Result = $impl.WriteCallBack; $impl.WriteCallBack = H; return Result; }; this.Assigned = function (V) { return (V!=undefined) && (V!=null) && (!rtl.isArray(V) || (V.length > 0)); }; this.StrictEqual = function (A, B) { return A === B; }; this.StrictInequal = function (A, B) { return A !== B; }; $mod.$init = function () { rtl.exitcode = 0; }; },null,function () { "use strict"; var $mod = this; var $impl = $mod.$impl; $impl.SameText = function (s1, s2) { return s1.toLowerCase() == s2.toLowerCase(); }; $impl.WriteBuf = ""; $impl.WriteCallBack = null; }); rtl.module("Types",["System"],function () { "use strict"; var $mod = this; this.TDirection = {"0": "FromBeginning", FromBeginning: 0, "1": "FromEnd", FromEnd: 1}; this.TDuplicates = {"0": "dupIgnore", dupIgnore: 0, "1": "dupAccept", dupAccept: 1, "2": "dupError", dupError: 2}; this.TSize = function (s) { if (s) { this.cx = s.cx; this.cy = s.cy; } else { this.cx = 0; this.cy = 0; }; this.$equal = function (b) { return (this.cx === b.cx) && (this.cy === b.cy); }; }; this.TPoint = function (s) { if (s) { this.x = s.x; this.y = s.y; } else { this.x = 0; this.y = 0; }; this.$equal = function (b) { return (this.x === b.x) && (this.y === b.y); }; }; this.TRect = function (s) { if (s) { this.Left = s.Left; this.Top = s.Top; this.Right = s.Right; this.Bottom = s.Bottom; } else { this.Left = 0; this.Top = 0; this.Right = 0; this.Bottom = 0; }; this.$equal = function (b) { return (this.Left === b.Left) && ((this.Top === b.Top) && ((this.Right === b.Right) && (this.Bottom === b.Bottom))); }; }; this.EqualRect = function (r1, r2) { var Result = false; Result = (((r1.Left === r2.Left) && (r1.Right === r2.Right)) && (r1.Top === r2.Top)) && (r1.Bottom === r2.Bottom); return Result; }; this.Rect = function (Left, Top, Right, Bottom) { var Result = new $mod.TRect(); Result.Left = Left; Result.Top = Top; Result.Right = Right; Result.Bottom = Bottom; return Result; }; this.Bounds = function (ALeft, ATop, AWidth, AHeight) { var Result = new $mod.TRect(); Result.Left = ALeft; Result.Top = ATop; Result.Right = ALeft + AWidth; Result.Bottom = ATop + AHeight; return Result; }; this.Point = function (x, y) { var Result = new $mod.TPoint(); Result.x = x; Result.y = y; return Result; }; this.PtInRect = function (aRect, p) { var Result = false; Result = (((p.y >= aRect.Top) && (p.y < aRect.Bottom)) && (p.x >= aRect.Left)) && (p.x < aRect.Right); return Result; }; this.IntersectRect = function (aRect, R1, R2) { var Result = false; var lRect = new $mod.TRect(); lRect = new $mod.TRect(R1); if (R2.Left > R1.Left) lRect.Left = R2.Left; if (R2.Top > R1.Top) lRect.Top = R2.Top; if (R2.Right < R1.Right) lRect.Right = R2.Right; if (R2.Bottom < R1.Bottom) lRect.Bottom = R2.Bottom; if ($mod.IsRectEmpty(lRect)) { aRect.set(new $mod.TRect($mod.Rect(0,0,0,0))); Result = false; } else { Result = true; aRect.set(new $mod.TRect(lRect)); }; return Result; }; this.UnionRect = function (aRect, R1, R2) { var Result = false; var lRect = new $mod.TRect(); lRect = new $mod.TRect(R1); if (R2.Left < R1.Left) lRect.Left = R2.Left; if (R2.Top < R1.Top) lRect.Top = R2.Top; if (R2.Right > R1.Right) lRect.Right = R2.Right; if (R2.Bottom > R1.Bottom) lRect.Bottom = R2.Bottom; if ($mod.IsRectEmpty(lRect)) { aRect.set(new $mod.TRect($mod.Rect(0,0,0,0))); Result = false; } else { aRect.set(new $mod.TRect(lRect)); Result = true; }; return Result; }; this.IsRectEmpty = function (aRect) { var Result = false; Result = (aRect.Right <= aRect.Left) || (aRect.Bottom <= aRect.Top); return Result; }; this.OffsetRect = function (aRect, DX, DY) { var Result = false; var $with1 = aRect.get(); $with1.Left += DX; $with1.Top += DY; $with1.Right += DX; $with1.Bottom += DY; Result = true; return Result; }; this.CenterPoint = function (aRect) { var Result = new $mod.TPoint(); function Avg(a, b) { var Result = 0; if (a < b) { Result = a + ((b - a) >>> 1)} else Result = b + ((a - b) >>> 1); return Result; }; Result.x = Avg(aRect.Left,aRect.Right); Result.y = Avg(aRect.Top,aRect.Bottom); return Result; }; this.InflateRect = function (aRect, dx, dy) { var Result = false; var $with1 = aRect.get(); $with1.Left -= dx; $with1.Top -= dy; $with1.Right += dx; $with1.Bottom += dy; Result = true; return Result; }; this.Size = function (AWidth, AHeight) { var Result = new $mod.TSize(); Result.cx = AWidth; Result.cy = AHeight; return Result; }; this.Size$1 = function (aRect) { var Result = new $mod.TSize(); Result.cx = aRect.Right - aRect.Left; Result.cy = aRect.Bottom - aRect.Top; return Result; }; }); rtl.module("JS",["System","Types"],function () { "use strict"; var $mod = this; rtl.createClass($mod,"EJS",pas.System.TObject,function () { this.$init = function () { pas.System.TObject.$init.call(this); this.FMessage = ""; }; this.Create$1 = function (Msg) { this.FMessage = Msg; }; }); this.TLocaleCompareOptions = function (s) { if (s) { this.localematched = s.localematched; this.usage = s.usage; this.sensitivity = s.sensitivity; this.ignorePunctuation = s.ignorePunctuation; this.numeric = s.numeric; this.caseFirst = s.caseFirst; } else { this.localematched = ""; this.usage = ""; this.sensitivity = ""; this.ignorePunctuation = false; this.numeric = false; this.caseFirst = ""; }; this.$equal = function (b) { return (this.localematched === b.localematched) && ((this.usage === b.usage) && ((this.sensitivity === b.sensitivity) && ((this.ignorePunctuation === b.ignorePunctuation) && ((this.numeric === b.numeric) && (this.caseFirst === b.caseFirst))))); }; }; this.New = function (aElements) { var Result = null; var L = 0; var I = 0; var S = ""; L = rtl.length(aElements); if ((L % 2) === 1) throw $mod.EJS.$create("Create$1",["Number of arguments must be even"]); I = 0; while (I < L) { if (!rtl.isString(aElements[I])) { S = String(I); throw $mod.EJS.$create("Create$1",[("Argument " + S) + " must be a string."]); }; I += 2; }; I = 0; Result = new Object(); while (I < L) { S = "" + aElements[I]; Result[S] = aElements[I + 1]; I += 2; }; return Result; }; this.hasValue = function (v) { if(v){ return true; } else { return false; }; }; this.isBoolean = function (v) { return typeof(v) == 'boolean'; }; this.isCallback = function (v) { return rtl.isObject(v) && rtl.isObject(v.scope) && (rtl.isString(v.fn) || rtl.isFunction(v.fn)); }; this.isChar = function (v) { return (typeof(v)!="string") && (v.length==1); }; this.isClass = function (v) { return (typeof(v)=="object") && (v!=null) && (v.$class == v); }; this.isClassInstance = function (v) { return (typeof(v)=="object") && (v!=null) && (v.$class == Object.getPrototypeOf(v)); }; this.isInteger = function (v) { return Math.floor(v)===v; }; this.isNull = function (v) { return v === null; }; this.isRecord = function (v) { return (typeof(v)=="function") && (typeof(v.$create) == "function"); }; this.isUndefined = function (v) { return v == undefined; }; this.isDefined = function (v) { return !(v == undefined); }; this.isUTF16Char = function (v) { if (typeof(v)!="string") return false; if ((v.length==0) || (v.length>2)) return false; var code = v.charCodeAt(0); if (code < 0xD800){ if (v.length == 1) return true; } else if (code <= 0xDBFF){ if (v.length==2){ code = v.charCodeAt(1); if (code >= 0xDC00 && code <= 0xDFFF) return true; }; }; return false; }; this.jsInstanceOf = function (aFunction, aFunctionWithPrototype) { return aFunction instanceof aFunctionWithPrototype; }; this.toNumber = function (v) { return v-0; }; this.toInteger = function (v) { var Result = 0; if ($mod.isInteger(v)) { Result = Math.floor(v)} else Result = 0; return Result; }; this.toObject = function (Value) { var Result = null; if (rtl.isObject(Value)) { Result = rtl.getObject(Value)} else Result = null; return Result; }; this.toArray = function (Value) { var Result = null; if (rtl.isArray(Value)) { Result = rtl.getObject(Value)} else Result = null; return Result; }; this.toBoolean = function (Value) { var Result = false; if ($mod.isBoolean(Value)) { Result = !(Value == false)} else Result = false; return Result; }; this.ToString = function (Value) { var Result = ""; if (rtl.isString(Value)) { Result = "" + Value} else Result = ""; return Result; }; this.TJSValueType = {"0": "jvtNull", jvtNull: 0, "1": "jvtBoolean", jvtBoolean: 1, "2": "jvtInteger", jvtInteger: 2, "3": "jvtFloat", jvtFloat: 3, "4": "jvtString", jvtString: 4, "5": "jvtObject", jvtObject: 5, "6": "jvtArray", jvtArray: 6}; this.GetValueType = function (JS) { var Result = 0; var t = ""; if ($mod.isNull(JS)) { Result = $mod.TJSValueType.jvtNull} else { t = typeof(JS); if (t === "string") { Result = $mod.TJSValueType.jvtString} else if (t === "boolean") { Result = $mod.TJSValueType.jvtBoolean} else if (t === "object") { if (rtl.isArray(JS)) { Result = $mod.TJSValueType.jvtArray} else Result = $mod.TJSValueType.jvtObject; } else if (t === "number") if ($mod.isInteger(JS)) { Result = $mod.TJSValueType.jvtInteger} else Result = $mod.TJSValueType.jvtFloat; }; return Result; }; }); rtl.module("MemoryBuffer",["System","JS"],function () { "use strict"; var $mod = this; rtl.createClass($mod,"TMemoryBuffer",pas.System.TObject,function () { this.$init = function () { pas.System.TObject.$init.call(this); this.byteBuffer = null; this.byteOffset = 0; this.floatBuffer = null; }; this.$final = function () { this.byteBuffer = undefined; this.floatBuffer = undefined; pas.System.TObject.$final.call(this); }; this.Create$1 = function (size) { this.byteBuffer = new Uint8Array(size); pas.System.Writeln("floats ",Math.floor(this.byteBuffer.byteLength / 4)); }; this.AddBytes = function (count, data) { pas.System.Writeln("AddBytes: @",this.byteOffset," -> ",data); this.byteBuffer.set(data,this.byteOffset); this.byteOffset = this.byteOffset + (count * 1); }; this.AddFloats = function (count, data) { var floatOffset = 0; floatOffset = Math.floor(this.byteOffset / 4); pas.System.Writeln("AddFloats: @",this.byteOffset,"\/",floatOffset," -> ",data); if (this.floatBuffer === null) this.floatBuffer = new Float32Array(this.byteBuffer.buffer,0,Math.floor(this.byteBuffer.byteLength / 4)); this.floatBuffer.set(data,floatOffset); this.byteOffset = this.byteOffset + (count * 4); }; }); });