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("Web",["System","Types","JS"],function () { "use strict"; var $mod = this; this.TJSClientRect = function (s) { if (s) { this.left = s.left; this.top = s.top; this.right = s.right; this.bottom = s.bottom; } else { this.left = 0.0; this.top = 0.0; this.right = 0.0; this.bottom = 0.0; }; this.$equal = function (b) { return (this.left === b.left) && ((this.top === b.top) && ((this.right === b.right) && (this.bottom === b.bottom))); }; }; this.TJSElementCreationOptions = function (s) { if (s) { this.named = s.named; } else { this.named = ""; }; this.$equal = function (b) { return this.named === b.named; }; }; this.TJSEventInit = function (s) { if (s) { this.bubbles = s.bubbles; this.cancelable = s.cancelable; this.scoped = s.scoped; this.composed = s.composed; } else { this.bubbles = false; this.cancelable = false; this.scoped = false; this.composed = false; }; this.$equal = function (b) { return (this.bubbles === b.bubbles) && ((this.cancelable === b.cancelable) && ((this.scoped === b.scoped) && (this.composed === b.composed))); }; }; rtl.createClassExt($mod,"TJSAnimationEvent",Event,"",function () { this.$init = function () { }; this.$final = function () { }; }); rtl.createClassExt($mod,"TJSLoadEvent",Event,"",function () { this.$init = function () { }; this.$final = function () { }; }); rtl.createClassExt($mod,"TJsPageTransitionEvent",Event,"",function () { this.$init = function () { }; this.$final = function () { }; }); rtl.createClass($mod,"TJSIDBTransactionMode",pas.System.TObject,function () { this.readonly = "readonly"; this.readwrite = "readwrite"; this.versionchange = "versionchange"; }); this.TJSIDBIndexParameters = function (s) { if (s) { this.unique = s.unique; this.multiEntry = s.multiEntry; this.locale = s.locale; } else { this.unique = false; this.multiEntry = false; this.locale = ""; }; this.$equal = function (b) { return (this.unique === b.unique) && ((this.multiEntry === b.multiEntry) && (this.locale === b.locale)); }; }; this.TJSCreateObjectStoreOptions = function (s) { if (s) { this.keyPath = s.keyPath; this.autoIncrement = s.autoIncrement; } else { this.keyPath = undefined; this.autoIncrement = false; }; this.$equal = function (b) { return (this.keyPath === b.keyPath) && (this.autoIncrement === b.autoIncrement); }; }; this.TJSPositionError = function (s) { if (s) { this.code = s.code; this.message = s.message; } else { this.code = 0; this.message = ""; }; this.$equal = function (b) { return (this.code === b.code) && (this.message === b.message); }; }; this.TJSPositionOptions = function (s) { if (s) { this.enableHighAccuracy = s.enableHighAccuracy; this.timeout = s.timeout; this.maximumAge = s.maximumAge; } else { this.enableHighAccuracy = false; this.timeout = 0; this.maximumAge = 0; }; this.$equal = function (b) { return (this.enableHighAccuracy === b.enableHighAccuracy) && ((this.timeout === b.timeout) && (this.maximumAge === b.maximumAge)); }; }; this.TJSCoordinates = function (s) { if (s) { this.latitude = s.latitude; this.longitude = s.longitude; this.altitude = s.altitude; this.accuracy = s.accuracy; this.altitudeAccuracy = s.altitudeAccuracy; this.heading = s.heading; this.speed = s.speed; } else { this.latitude = 0.0; this.longitude = 0.0; this.altitude = 0.0; this.accuracy = 0.0; this.altitudeAccuracy = 0.0; this.heading = 0.0; this.speed = 0.0; }; this.$equal = function (b) { return (this.latitude === b.latitude) && ((this.longitude === b.longitude) && ((this.altitude === b.altitude) && ((this.accuracy === b.accuracy) && ((this.altitudeAccuracy === b.altitudeAccuracy) && ((this.heading === b.heading) && (this.speed === b.speed)))))); }; }; this.TJSPosition = function (s) { if (s) { this.coords = new $mod.TJSCoordinates(s.coords); this.timestamp = s.timestamp; } else { this.coords = new $mod.TJSCoordinates(); this.timestamp = ""; }; this.$equal = function (b) { return this.coords.$equal(b.coords) && (this.timestamp === b.timestamp); }; }; this.TJSServiceWorkerContainerOptions = function (s) { if (s) { this.scope = s.scope; } else { this.scope = ""; }; this.$equal = function (b) { return this.scope === b.scope; }; }; this.TJSTextMetrics = function (s) { if (s) { this.width = s.width; this.actualBoundingBoxLeft = s.actualBoundingBoxLeft; this.actualBoundingBoxRight = s.actualBoundingBoxRight; this.fontBoundingBoxAscent = s.fontBoundingBoxAscent; this.fontBoundingBoxDescent = s.fontBoundingBoxDescent; this.actualBoundingBoxAscent = s.actualBoundingBoxAscent; this.actualBoundingBoxDescent = s.actualBoundingBoxDescent; this.emHeightAscent = s.emHeightAscent; this.emHeightDescent = s.emHeightDescent; this.hangingBaseline = s.hangingBaseline; this.alphabeticBaseline = s.alphabeticBaseline; this.ideographicBaseline = s.ideographicBaseline; } else { this.width = 0.0; this.actualBoundingBoxLeft = 0.0; this.actualBoundingBoxRight = 0.0; this.fontBoundingBoxAscent = 0.0; this.fontBoundingBoxDescent = 0.0; this.actualBoundingBoxAscent = 0.0; this.actualBoundingBoxDescent = 0.0; this.emHeightAscent = 0.0; this.emHeightDescent = 0.0; this.hangingBaseline = 0.0; this.alphabeticBaseline = 0.0; this.ideographicBaseline = 0.0; }; this.$equal = function (b) { return (this.width === b.width) && ((this.actualBoundingBoxLeft === b.actualBoundingBoxLeft) && ((this.actualBoundingBoxRight === b.actualBoundingBoxRight) && ((this.fontBoundingBoxAscent === b.fontBoundingBoxAscent) && ((this.fontBoundingBoxDescent === b.fontBoundingBoxDescent) && ((this.actualBoundingBoxAscent === b.actualBoundingBoxAscent) && ((this.actualBoundingBoxDescent === b.actualBoundingBoxDescent) && ((this.emHeightAscent === b.emHeightAscent) && ((this.emHeightDescent === b.emHeightDescent) && ((this.hangingBaseline === b.hangingBaseline) && ((this.alphabeticBaseline === b.alphabeticBaseline) && (this.ideographicBaseline === b.ideographicBaseline))))))))))); }; }; this.TJSWheelEventInit = function (s) { if (s) { this.deltaX = s.deltaX; this.deltaY = s.deltaY; this.deltaZ = s.deltaZ; this.deltaMode = s.deltaMode; } else { this.deltaX = 0.0; this.deltaY = 0.0; this.deltaZ = 0.0; this.deltaMode = 0; }; this.$equal = function (b) { return (this.deltaX === b.deltaX) && ((this.deltaY === b.deltaY) && ((this.deltaZ === b.deltaZ) && (this.deltaMode === b.deltaMode))); }; }; rtl.createClass($mod,"TJSKeyNames",pas.System.TObject,function () { this.Alt = "Alt"; this.AltGraph = "AltGraph"; this.CapsLock = "CapsLock"; this.Control = "Control"; this.Fn = "Fn"; this.FnLock = "FnLock"; this.Hyper = "Hyper"; this.Meta = "Meta"; this.NumLock = "NumLock"; this.ScrollLock = "ScrollLock"; this.Shift = "Shift"; this.Super = "Super"; this.symbol = "Symbol"; this.SymbolLock = "SymbolLock"; this.Enter = "Enter"; this.Tab = "Tab"; this.Space = " "; this.ArrowDown = "ArrowDown"; this.ArrowLeft = "ArrowLeft"; this.ArrowRight = "ArrowRight"; this.ArrowUp = "ArrowUp"; this._End = "End"; this.Home = "Home"; this.PageDown = "PageDown"; this.PageUp = "PageUp"; this.BackSpace = "Backspace"; this.Clear = "Clear"; this.Copy = "Copy"; this.CrSel = "CrSel"; this.Cut = "Cut"; this.Delete = "Delete"; this.EraseEof = "EraseEof"; this.ExSel = "ExSel"; this.Insert = "Insert"; this.Paste = "Paste"; this.Redo = "Redo"; this.Undo = "Undo"; this.Accept = "Accept"; this.Again = "Again"; this.Attn = "Attn"; this.Cancel = "Cancel"; this.ContextMenu = "Contextmenu"; this.Escape = "Escape"; this.Execute = "Execute"; this.Find = "Find"; this.Finish = "Finish"; this.Help = "Help"; this.Pause = "Pause"; this.Play = "Play"; this.Props = "Props"; this.Select = "Select"; this.ZoomIn = "ZoomIn"; this.ZoomOut = "ZoomOut"; this.BrightnessDown = "BrightnessDown"; this.BrightnessUp = "BrightnessUp"; this.Eject = "Eject"; this.LogOff = "LogOff"; this.Power = "Power"; this.PowerOff = "PowerOff"; this.PrintScreen = "PrintScreen"; this.Hibernate = "Hibernate"; this.Standby = "Standby"; this.WakeUp = "WakeUp"; this.AllCandidates = "AllCandidates"; this.Alphanumeric = "Alphanumeric"; this.CodeInput = "CodeInput"; this.Compose = "Compose"; this.Convert = "Convert"; this.Dead = "Dead"; this.FinalMode = "FinalMode"; this.GroupFirst = "GroupFirst"; this.GroupLast = "GroupLast"; this.GroupNext = "GroupNext"; this.GroupPrevious = "GroupPrevious"; this.ModelChange = "ModelChange"; this.NextCandidate = "NextCandidate"; this.NonConvert = "NonConvert"; this.PreviousCandidate = "PreviousCandidate"; this.Process = "Process"; this.SingleCandidate = "SingleCandidate"; this.HangulMode = "HangulMode"; this.HanjaMode = "HanjaMode"; this.JunjaMode = "JunjaMode"; this.Eisu = "Eisu"; this.Hankaku = "Hankaku"; this.Hiranga = "Hiranga"; this.HirangaKatakana = "HirangaKatakana"; this.KanaMode = "KanaMode"; this.Katakana = "Katakana"; this.Romaji = "Romaji"; this.Zenkaku = "Zenkaku"; this.ZenkakuHanaku = "ZenkakuHanaku"; this.F1 = "F1"; this.F2 = "F2"; this.F3 = "F3"; this.F4 = "F4"; this.F5 = "F5"; this.F6 = "F6"; this.F7 = "F7"; this.F8 = "F8"; this.F9 = "F9"; this.F10 = "F10"; this.F11 = "F11"; this.F12 = "F12"; this.F13 = "F13"; this.F14 = "F14"; this.F15 = "F15"; this.F16 = "F16"; this.F17 = "F17"; this.F18 = "F18"; this.F19 = "F19"; this.F20 = "F20"; this.Soft1 = "Soft1"; this.Soft2 = "Soft2"; this.Soft3 = "Soft3"; this.Soft4 = "Soft4"; this.Decimal = "Decimal"; this.Key11 = "Key11"; this.Key12 = "Key12"; this.Multiply = "Multiply"; this.Add = "Add"; this.NumClear = "Clear"; this.Divide = "Divide"; this.Subtract = "Subtract"; this.Separator = "Separator"; this.AppSwitch = "AppSwitch"; this.Call = "Call"; this.Camera = "Camera"; this.CameraFocus = "CameraFocus"; this.EndCall = "EndCall"; this.GoBack = "GoBack"; this.GoHome = "GoHome"; this.HeadsetHook = "HeadsetHook"; this.LastNumberRedial = "LastNumberRedial"; this.Notification = "Notification"; this.MannerMode = "MannerMode"; this.VoiceDial = "VoiceDial"; }); }); rtl.module("webgl",["System","JS","Web"],function () { "use strict"; var $mod = this; }); rtl.module("GLTypes",["System","webgl"],function () { "use strict"; var $mod = this; rtl.createClass($mod,"TMat4",pas.System.TObject,function () { this.$init = function () { pas.System.TObject.$init.call(this); this.RawComponents = rtl.arraySetLength(null,0.0,4,4); }; this.$final = function () { this.RawComponents = undefined; pas.System.TObject.$final.call(this); }; this.Identity = function () { this.RawComponents[0][0] = 1.0; this.RawComponents[0][1] = 0.0; this.RawComponents[0][2] = 0.0; this.RawComponents[0][3] = 0.0; this.RawComponents[1][0] = 0.0; this.RawComponents[1][1] = 1.0; this.RawComponents[1][2] = 0.0; this.RawComponents[1][3] = 0.0; this.RawComponents[2][0] = 0.0; this.RawComponents[2][1] = 0.0; this.RawComponents[2][2] = 1.0; this.RawComponents[2][3] = 0.0; this.RawComponents[3][0] = 0.0; this.RawComponents[3][1] = 0.0; this.RawComponents[3][2] = 0.0; this.RawComponents[3][3] = 1.0; }; }); this.GLTexVertex = function (s) { if (s) { this.pos = s.pos; this.color = s.color; } else { this.pos = []; this.color = []; }; this.$equal = function (b) { return (this.pos === b.pos) && (this.color === b.color); }; }; this.GLTexVertex_Sizeof = function () { var Result = 0; Result = $mod.TVec2_Sizeof() + $mod.TRGBAf_Sizeof(); return Result; }; this.TVec2_Sizeof = function () { var Result = 0; Result = 4 * 2; return Result; }; this.TRGBAb_Sizeof = function () { var Result = 0; Result = 1 * 4; return Result; }; this.TRGBAf_Sizeof = function () { var Result = 0; Result = 4 * 4; return Result; }; this.V2 = function (x, y) { var Result = []; Result[0] = x; Result[1] = y; return Result; }; this.RGBAb = function (r, g, b, a) { var Result = []; Result[0] = r; Result[1] = g; Result[2] = b; Result[3] = a; return Result; }; this.RGBAf = function (r, g, b, a) { var Result = []; Result[0] = r; Result[1] = g; Result[2] = b; Result[3] = a; return Result; }; });